web16
这道题的考点的是MD5碰撞:
PHP在处理哈希字符串时,
会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
"===“和”!==“即strict比较符,只有在类型相同时才相等。”==“和”!="即non-strict比较符,会在类型转换后进行比较。
此外0 == 字符会被认为是正确的,可以绕过验证
接下来看题,首先查看源码,没啥有用的东西,其次题目提示“备份是个好习惯”,那就先dirsearch扫描一波
得到了一个bak的备份文件,下载下来,里面有源码
首先是个文件包含的漏洞,然后给大家在菜鸡的角度解读下代码
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?'); // 它会先查看URI中是有 ? ,如果有,就匹配 ? 及后面的所有内容
$str = substr($str,1); // 匹配的内容从第一位开始匹配,也是就是不匹配'?'了,因为'?'是第0位
$str = str_replace('key','',$str); // 在匹配的内容中会将'key'替换为空
parse_str($str); // 将字符串解析至变量中
echo md5($key1); // 回显MD5加密后的变量key1
echo md5($key2); // 回显MD5加密后的变量key2
if(md5($key1) == md5($key2) && $key1 !== $key2){ // 如果加密后的key1 == key2 并且 key1 !== key2
echo $flag."取得flag"; // 回显flag
再结合文章开头的md5()这个函数的特点,构造payload
http://114.67.246.176:13503/?kekeyy1=s878926199a&kekeyy2=QLTHNDT
得到最终的flag
这道题目的payload的不止这一种,剩余的大家可以自行尝试
注:萌新第一次写write up,不足之处还请见谅,不对之处欢迎批评指正