题目来源:前女友 - Bugku CTF
访问页面,这里有个链接
点金链接,得到代码:
<?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;
}
}
}
?>
关键点是md5 的值比较 和 strcmp 比较
MD5 compare漏洞
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
常见的payload有
0x01 md5(str)
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
sha1(str)
sha1('aaroZmOk')
sha1('aaK1STfY')
sha1('aaO8zKZF')
sha1('aa3OFF9m')
0x02 md5(md5(str)."SALT")
2
同时MD5不能处理数组,若有以下判断则可用数组绕过
if(@md5($_GET['a']) == @md5($_GET['b']))
{
echo "yes";
}
//http://127.0.0.1/1.php?a[]=1&b[]=2
strcmp
如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
1、以下代码 中是将两个参数先转换成string类型。
2、当比较数组和字符串的时候,返回是0。
3、如果参数不是string类型,直接return了
<?php
$password=$_GET['password'];
if (strcmp('xd',$password)) {
echo 'NO!';
} else{
echo 'YES!';
}
?>
所以,利用这两个漏洞,传递数组为参数
http://114.67.175.224:17303/?v1[]=1&v2=2&v3=1
得到flag
参考PHP函数漏洞:PHP 函数漏洞总结 - zw1sh - 博客园 (cnblogs.com)