![](https://i-blog.csdnimg.cn/blog_migrate/432089c4bcbe039fd22130c7e2e640fe.png)
进行代码审计,if($_POST['a']!=$_POST['b']&&md5($_POST))==md5($_POST['b']))
![](https://i-blog.csdnimg.cn/blog_migrate/e07f7faaad009003020b1e5def49258c.png)
法一:找出md5值都是两个0e开头的开头的。原理是PHP里面在做 == 的时候会先把两边的类型转成一样的,因为是0e开头,php会认为它是科学技计数法,
而0的多少次方都是0。
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e34276841682245152497411725446
![](https://i-blog.csdnimg.cn/blog_migrate/bafb063b272a64e00643671b9355bac7.png)
注意:将GET改成POST;加上Content-Type:application……
法二:数组绕过。这里也考察了一个PHP的md5函数漏洞,就是如果md5函数的参数是一个数组值,会导致函数返回false。
原理是md5等函数不能处理数组,导致函数返回Null。而Null是等于Null的,导致了绕过。
![](https://i-blog.csdnimg.cn/blog_migrate/0753ffd4ad66b95c8530c700bceac31d.png)
第一关通过!
if($_POST['c']!=$_POST['b']&&md5($_POST))===md5($_POST['b']))
![](https://i-blog.csdnimg.cn/blog_migrate/21ea2bed3e1f1809f5570c28ae2fbf95.png)
第二关如第一关一样,两个方法都行。
注意:直接在a[]=1&b[]=2后面接着写就行,不需要另外起行,我这里还卡了蛮久。
第二关通过!
if ((string)$_POST['e']!== (string)$_POST['f'] && md5($_POST['e']) === md5($_POST['f']))
多了个(string),这里我们需要用超长的字符串且MD5值相等,例:
%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
![](https://i-blog.csdnimg.cn/blog_migrate/cf8dd639cadc7a49b91e6690507bc75d.png)
注意:数组,普通字符串得用a[]=……,超长字符串得用a=,否则不成功!
第三关通过,获得flag!