题目概述
脚本要求提交三个GET参数v1、v2和v3,并满足一定条件才能获取到flag。
解题步骤
- 分析脚本
首先,我们来看看这个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; |
}else{ |
echo ‘no~no~no!’; |
} |
} |
} |
从脚本中可以看出,要获取flag,需要满足以下条件:
v1和v2的值不相等,但它们的MD5哈希值相等(即MD5哈希碰撞)。
v3的值需要与$flag相等,这里使用strcmp函数进行比较。
- 寻找MD5哈希碰撞对
由于MD5算法存在哈希碰撞,我们可以找到一对值,它们不相等但MD5哈希值相等。经过查找或计算,我们得到了这样一对值:s878926199和155964671a。
- 绕过strcmp比较
接下来,我们需要让v3与$flag相等。但是,由于我们不知道$flag的具体值,这里需要一个技巧。注意到strcmp函数在比较数组和字符串时会返回0(表示相等),如果v3是一个数组而不是字符串,那么strcmp函数会比较失败,但由于PHP的类型转换机制,它可能不会直接报错,而是认为它们相等。因此,我们可以尝试将v3设置为一个数组。
- 构造输入
基于上述分析,我们构造了以下输入:
?v1=s878926199a&&v2=s155964671a&&v3[]=9 |
这里,v3[]=2表示v3是一个数组,其中包含一个元素2。由于strcmp无法直接比较数组和字符串,它可能会返回0,从而绕过比较,使得脚本输出flag。
- 验证结果
