bugku 前女友WP (md5绕过 strcmp绕过)
bugku 前女友WP (md5绕过 strcmp绕过)
php代码如下
<?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;
}
}
}
?>
关键两点
- v1 != v2 && md5(v1) == md5(v2)
- strcmp(v3, flag)==0
1.md5绕过
法1:md5碰撞
使用fastcoll等工具进行md5碰撞,得到两个本身不同但md5码完全相同的字符串
法2:科学计数法绕过弱类型比较
使用两个不同的字符串,但md5码都以0e开头,即值为0,判断为相等
如:
QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
法3:数组绕过md5函数,返回null
php中md5()之类的哈希函数计算的是一个字符串的哈希值,对于数组则返回false
所以传入两个不同的数组即可绕过
2.strcmp绕过
strcmp函数原型
strcmp
Binary safe string comparison
<?php
function strcmp(string $string1, string $string2): int { }
@param string $string1 — The first string.
@param string $string2 — The second string.
@return int
比较的是string字符串类型大小,如果传入数组则直接返回0,传入数组即可成功