一、知识点:
MD5加密
PHP中:
==
运算符用于比较两个变量的值是否相等,会进行类型转换。===
运算符用于比较两个变量的值和数据类型是否完全相等,不会进行类型转换。- 在 PHP 中,将两个以 `0e` 开头的字符串进行比较时会认为它们相等是因为 PHP 在进行非严格相等比较时(使用 `==` 运算符)会进行类型转换,而这个类型转换特性在处理以 `0e` 开头的字符串时产生了有趣的效果。以 `0e` 开头的字符串在 PHP 中会被解释为科学计数法表示的数值,并且如果将其转换为整数或浮点数时,它们会被解释为 `0`。
例如:
$str1 = "0e1234"; // "0e" 后面是一个较大的数字
$str2 = "0e5678"; // "0e" 后面是另一个较大的数字var_dump($str1 == $str2); // 输出: bool(true)
这是因为在非严格相等比较时,PHP 将这两个字符串转换为数值类型并且数值都解释为 `0`,因此它们被认为是相等的。但要注意,这种现象仅限于非严格相等比较(`==` 运算符)。在严格相等比较时(`===` 运算符),PHP 会同时比较值和数据类型,所以这两个以 `0e` 开头的字符串在严格相等比较时不会被认为相等。因此,对于哈希值的比较,尤其是在安全敏感的场景中,应该使用严格相等比较来确保数据的准确性和安全性。即使用 `===` 运算符来进行比较。
md5
等函数不能处理数组,导致函数返回Null
二、解题:
开题,页面一个输入框,试试sql注入,没反应,用sqlmap跑也啥也没有。题目说是MD5,抓个包看看
有个hint,发现我们输入的内容会进行MD5运算,所以还是一个sql注入,只是需要用MD5加密后的万能密码注入,查资料后,
ffifdyop这个字符串MD5加密后得到276F722736C95D99E921722CF9ED621C
在将其进行16进制转字符后就是 'or' ******后面这串不为0就行 ,提交ffifdyop
再看页面源码
用到上面的知识点
1、==
运算符用于比较两个变量的值是否相等,会进行类型转换2、在 PHP 中,将两个以 `0e` 开头的字符串进行比较时会认为它们相等是因为 PHP 在进行非严格相等比较时(使用 `==` 运算符)会进行类型转换,而这个类型转换特性在处理以 `0e` 开头的字符串时产生了有趣的效果。以 `0e` 开头的字符串在 PHP 中会被解释为科学计数法表示的数值,并且如果将其转换为整数或浮点数时,它们会被解释为 `0`
所以我们找两个MD5加密后开头为0e 的两个明文就行
QNKCDZO
240610708
构造payload:
505706c8-8a86-43fd-be42-c3f19cbeb4e6.node4.buuoj.cn:81/levels91.php?a=QNKCDZO&b=240610708
再看页面显示和上面知识点
1、===
运算符用于比较两个变量的值和数据类型是否完全相等,不会进行类型转换。
2、md5
等函数不能处理数组,导致函数返回Null
所以我们将两个变量搞成数组就可以了
payload为: