题目:
打开网址出现:
看着像是两段重复的md5摘要,用解码工具解码,得到:
看出似乎是对空字符生成了md5码并输出,回头看题目描述:备份是个好习惯,猜测是查看备份文件
尝试输入网址 http://114.67.175.224:18504/index.php.bak,果然得到一个备份文件:index.php.bak
删除文件后缀名 .bak,打开文件:
php代码解释:
第11行:$str = strstr($_SERVER['REQUEST_URI'], '?');
$_SERVER[] 是预定义超全局数组变量的一种,是一个包含了诸如头信息(Header),路径(path),以及脚本位置(script location)等信息的数组
$_SERVER['RWQUEST_URI']是指访问的整个url网址,例如访问
"http://114.67.175.224:18504?key=123&b=4" (以下举例都先用该url)
则$_SERVER['RWQUEST_URI']= "http://114.67.175.224:18504?key=123&b=4"
strstr()函数:搜索一个字符串在另一个字符串中的第一次出现的位置,返回字符串的其余部分(从匹配点)。
因此第11行代码含义就是将整个url中?之后的部分赋予$str变量,如对于上诉网址,$str="?key=123&b=4";
第12行:$str = substr($str,1);
substr(string,start,length),函数返回字符串string的一部分,start为开始位置(默认开始为0),length为返回的字符串长度。
所以第十二行含义是$str="key=123&b=4" (按以上url)
第13行:$str = str_replace('key','',$str);
str_replace(find_s,replace,string),指用字符串relpace代替string中出现的字符串find_s,
则,第13行代码的含义是将$str中出现的所有"key"代替成空字符,结果如:$str="=123&b=4"
第14行:parse_str($str);
parse_str()函数可以将一串字符串解析成多个变量,按上例url,结果为:
$=123 $b=4
通过第15行和第17行输出了$key1和$key2的md5码,因为函数没有为$key1和$key2赋值。结合起初打开网页看到的两串解码为空字符的md5码,$key1和$key2均为空字符
根据这个if语句,可以推出当$key1和$key2的md5码相同,而$key1和$key2不同时,会输出flag,
因此可以结合函数输入网址:http://114.67.175.224:18504?key1=...&key2=..."为key1与key2赋值,
但由于第13行,会将字符串中的key字符替换,这里使用双写绕过替换规则:
即字符串写成"kkeyey1=...&kekeyy2=..."时,该函数只会替代源字符串的key,最终得到想要的结果"key1=...&key2=..."
进行到if语句判断,这里利用了php弱类型的漏洞:MD5绕过的技巧_网安溦寀的博客-优快云博客
对于if(md5($key1) == md5($key2)),想要满足这个判断只需要构造出MD5值为0e开头的字符串,弱类型比较会认为字符串使用了科学技术法,0的多少次方都是0,因此可以绕过
因此只要使得$key1与$key2是两个不同的但是MD5码都是0e开头的字符串即可
输入网址:http://114.67.175.224:18504?kkeyey1=QNKCDZO&kekeyy2=240610708
得到结果: