解题流程
0、打开网页
发现其内有一个链接
1、点击链接,查看PHP源代码
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){ // 检测以GET方式传入的三个参数 v1、v2、v3$v1 = $_GET['v1']; // 变量v1等于传入的参数v1$v2 = $_GET['v2']; // 变量v2等于传入的参数v2$v3 = $_GET['v3']; // 变量v3等于传入的参数v3if($v1 != $v2 && md5($v1) == md5($v2)){ // v1不等于v2,并且MD5加密后的v1等于v2(典型的MD5碰撞,随意在网上搜索两个值就可以)if(!strcmp($v3, $flag)){ // 这里是用来比较字符串,但是查了一下,这个函数当接受到不符合字符串类型的参数就会发生错误,并返回0,比如数组echo $flag;}}
}
?>
2、代码审计,构造payload
我们需要构造三个参数:v1,v2,v3,其内v1和v2需要值不同且md5的值相同,利用md5函数的特性,如果使用一个不可md5的数据类型传入的话那么md5函数将返回false,这个也是返回值,题目要求的是md5函数的返回值相等,所以就可以用两个值不同但不可md5的数据类型传入即可
这里我们使用数组进行绕过,令v1[]=1, v2[]=2
继续分析,第二个是strcmp函数,需要v3和flag的值相同才返回flag的值,我们依旧利用函数特性,strcmp函数如果出错,那么它的返回值也会是0,和字符串相等时返回值一致,
依旧使用数组绕过,令v3[]=3,因为strcmp接收到不符合字符串类型的参数会发生错误
3、上传最后payload:http://114.67.246.176:16109/?v1[]=1,&&v2[]=2&&v3[]=3
或者
得到