WEB_备份是个好习惯
题目链接:http://123.206.87.240:8002/web16/
题解:
打开题目链接,得到一串东西
题目标题为”备份是个好习惯“,故考虑修改url为index.php.bak(bak为网站的备份文件),修改后自动得到一个备份文件
http://123.206.87.240:8002/web16/index.php.bak
打开此文件,是一段PHP源代码
可以看出题目需要我们传入两个值,分别为key1和key2,且key1和key2的值不能相同但md5值相同,通过传入值不相同的数组可以实现。但是有一点需要注意,语句str_replace(‘key’,’ ',$str)会将key替换为空格,这一点我们可以通过双写key对其进行绕过,最终的payload:?kekeyy1[]=1&kekeyy2[]=2
有两种方法绕过:
md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。 payload: ?kkeyey1[]=1&kkeyey2[]=2
利用==比较漏洞 如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。 下列的字符串的MD5值都是0e开头的: QNKCDZO 240610708 s878926199a s155964671a s214587387a s214587387a 最后看看d41d8cd98f00b204e9800998ecf8427e是什么意思,拿到MD5解密试一下,结果为NULL,也就是说这是NULL的MD5值,因为默认是没有传入key1和key2的,这两个值也就是null. payload: ?kkeyey1=QNKCDZO&kkeyey2=s878926199a
d41d8cd98f00b204e9800998ecf8427ed41d8cd98f00b204e9800998ecf8427e的MD5解密为空【MD5在线解密链接:https://www.cmd5.com/】
综上所述,两种方法可行:
或者:
即flag为:Bugku{OH_YOU_FIND_MY_MOMY}