1.使用burp抓包重发,在响应包中看到提示,密码框直接输入ffifdyop,百度搜索md5($pass,true),发现万能密码ffifdyop
实现md5绕过原因:
"select * from 'admin' where password='".md5($pass,true)."'"
当raw项为true时,数据库会把16进制转为ascii解释,返回的这个原始二进制,不是普通的二进制(0,1),而是'or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c这种。
or后面的句子第一个字母是非0打头的数字符,比如为‘1abc’或者‘-1bde’都会被认为是true。以0开头会认为是false。
这时原来的语句就是:
"select * from 'admin' where password=''or'6蒥欓!r,?b' "
该语句or 6,永真
2.进入下一个网页查看源码,发现是一个简单的md5弱绕过,构造数组即可:
http://4cd83477-894d-4dc4-a3c4-6ff6b6c6a96b.node4.buuoj.cn:81/levels91.php?a[]=1&b[]=2
3.得到flag.php的代码,和上面一样使用绕过比较md5的强绕过,只不过这里注意是post传参:
param1[]=1¶m2[]=2
总结:
本题比较简单,主要了解md5绕过的万能密码原理
下面解释md5绕过的三种方式:
1.md5加密和0e开头的字符串:
原理:0e开头的会被识别成科学计数法,结果均为0,比较时0=0为true绕过
QNKCDZO s878926199a s155964671a s214587387a s214587387a
2.数组绕过
原理:md5()函数无法处理,返回null,在强比较里面null=null为true绕过
3.md5碰撞
收集一组相等的字符串:
a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2