一打开就是一坨看起来像乱码的东西
查看源码才看的舒服点,原来是一串PHP代码
这么长一段,翻译起来还有点麻烦
首先第一个if语句
检测GET传参gg和id是否存在
如果不存在就输出’Please input first‘(请先输入)并利用die函数退出脚本
如果存在分别赋值给对应变量,并执行下一步if判断
第二个if语句
运用完全比较,判断MD5编码后的id是否值和类型都等于md5编码后 gg,并且变量id本身不等于变量gg
如果不是就输出’You are not a real hacker!‘(你不是一个真正的黑客)
如果是就输出’You got the first step‘(你完成了第一步),并执行下一步if判断
第三个if语句
检测POST方法的passwd是否存在
如果不存在就输出’only one way to get the flag’(只有一种方法获取flag),并退出脚本
如果存在就赋值给对应变量,并执行下一个if判断
第四个if语句
检测passwd变量是否不由数字或者数字字符串组成
如果不由数字或数字字符串组成,则输出‘You can not get it !’(你不能得到它)
如果是数字或数字字符串组成,则进行下一个if判断
第五个if语句
弱比较,仅比较值,判断passwd变量的值是否为1234567
如果不是则输出‘can you think twice?’(你能三思吗?)
如果是则获取到flag
总结来说,我们需要连个GET参数和一个POST参数,需要绕过两处
if (md5($id) === md5($gg) && $id !== $gg)
if (!is_numeric($passwd) if($passwd==1234567)
第一处是md5强类型比较绕过,我们可以构造/?id[]=1&&gg[]==2
因为md5()函数计算的是一个字符串的哈希值,对于数组则返回false ,(false === false) 为true
第二处是弱类型比较绕过,既要passwd的参数不为数字或数字字符串组成,又要passwd参数的值等于123456,我可以构造passwd='123456a'
因为在php8.0之前,数字和字符串的弱类型比较取的是字符以前的数据
也就是说:(123a == 123) 返回的是true
我抓包抓的是GET传参,可以在burp中更改为POST请求方式后再传参,不然passwd的传参不会成功,并且会报错