在输入框查询任何内容都返回为空,尝试sql注入无果,用bp抓包
select * from 'admin' where password=md5($pass,true)
确实执行了我们的查询,但是在通过where时,条件不匹配,导致报错
需要password=md5($pass,true)条件为真时,才会执行select * form admin
md5()函数会将我们输入的值,加密,然后转换成16字符的二进制格式,由于ffifdyop被md5加密后的276f722736c95d99e921722cf9ed621c转换成16位原始二进制格式为'or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c,这个字符串前几位刚好是' or '6
MD5加密 | 276F722736C95D99E921722CF9ED621C |
---|---|
16位原始二进制格式 | 'or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c |
string | 'or’6]!r,b |
我们将ffifdyop带入测试环境,查看执行结果
所以输入ffifdyop后,内部执行语句就会变为
select * from 'admin' where password='or'6�]��!r,��b'
但是为什么偏偏当password='or'6�]��!r,��b'时,会判断为真呢?在mysql内,用作布尔型判断时,以1开头的字符串会被当做整型数。要注意的是这种情况是必须要有单引号括起来的,比如password=' or '1xxxx',那么就相当于password=' or 1,所以返回值就是true
所以这里使用的sql语句可以化简为
select * from 'admin' where password='or 6
跳转至下一个页面,右击查看源码
<!--
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){ //a不等于b的同时,MD5后的a要等于MD5后的b
-->
考的是md5弱类型,为0e开头的会被识别为科学记数法,结果均为0
构造payload
?a=QNKCDZO&b=s878926199a
跳转至下一个页面
考的是MD5强碰撞,如果传参不是字符串,而是数组,md5()函数无法解出数值,就会得到===强比较的值相等
payload:param1[]=1¶m2[]=2