题目概述

脚本要求提交三个GET参数v1、v2和v3,并满足一定条件才能获取到flag。

解题步骤

  1. 分析脚本

首先,我们来看看这个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函数进行比较。

  1. 寻找MD5哈希碰撞对

由于MD5算法存在哈希碰撞,我们可以找到一对值,它们不相等但MD5哈希值相等。经过查找或计算,我们得到了这样一对值:s878926199和155964671a。

  1. 绕过strcmp比较

接下来,我们需要让v3与$flag相等。但是,由于我们不知道$flag的具体值,这里需要一个技巧。注意到strcmp函数在比较数组和字符串时会返回0(表示相等),如果v3是一个数组而不是字符串,那么strcmp函数会比较失败,但由于PHP的类型转换机制,它可能不会直接报错,而是认为它们相等。因此,我们可以尝试将v3设置为一个数组。

  1. 构造输入

基于上述分析,我们构造了以下输入:

?v1=s878926199a&&v2=s155964671a&&v3[]=9

这里,v3[]=2表示v3是一个数组,其中包含一个元素2。由于strcmp无法直接比较数组和字符串,它可能会返回0,从而绕过比较,使得脚本输出flag。

  1. 验证结果
admin

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注