[GDOUCTF 2023]受不了一点

代码审计

 进入环境又是代码审计

<?php
error_reporting(0);
header("Content-type:text/html;charset=utf-8");
if(isset($_POST['gdou'])&&isset($_POST['ctf'])){
    $b=$_POST['ctf'];
    $a=$_POST['gdou'];
    if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b)){
        if(isset($_COOKIE['cookie'])){
           if ($_COOKIE['cookie']=='j0k3r'){
               if(isset($_GET['aaa']) && isset($_GET['bbb'])){
                  $aaa=$_GET['aaa'];
                  $bbb=$_GET['bbb'];
                 if($aaa==114514 && $bbb==114514 && $aaa!=$bbb){
                   $give = 'cancanwordflag';
                   $get ='hacker!';
                   if(isset($_GET['flag']) && isset($_POST['flag'])){
                         die($give);
                    }
                   if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
                       die($get);
                    }
                    foreach ($_POST as $key => $value) {
                        $$key = $value;
                   }
                    foreach ($_GET as $key => $value) {
                         $$key = $$value;
                    }
                   echo $flag;
            }else{
                  echo "洗洗睡吧";
                 }
    }else{
        echo "行不行啊细狗";
        }
  }
}
else {
  echo '菜菜';
}
}else{
  echo "就这?";
}
}else{
  echo "别来沾边";
}
?>

1. 第一行代码`error_reporting(0);`用于禁止错误报告。

2. 第二行代码设置了响应头部,告诉浏览器使用UTF-8编码显示内容。

 

接下来,代码使用条件语句检查`$_POST['gdou']`和`$_POST['ctf']`是否被设置。如果两个变量都被设置了,就进入下一层判断。如果不满足就回显别来沾边

在第四行代码,代码将`$_POST['ctf']`和`$_POST['gdou']`赋值给变量`$b`和`$a`。

接下来,代码使用条件语句检查`$_POST['gdou']`和`$_POST['ctf']`是否不相等,并且它们的MD5散列值是否相等。如果满足这两个条件,就进入下一层判断。如果不满足就回显就这?

这个很好绕过,我们可以直接采取数组绕过,MD5不能解析数组会返回null

 

 

代码检查一个名为`$_COOKIE['cookie']`的cookie是否被设置,并且它的值等于`'j0k3r'`。如果满足这个条件,就进入下一层判断。否则回显菜菜

代码检查`$_GET['aaa']`和`$_GET['bbb']`是否被设置。如果满足这个条件,就进入下一层判断。否则回显行不行啊细狗

然后将`$_GET['aaa']`和`$_GET['bbb']`的值分别赋给变量`$aaa`和`$bbb`。

对`$aaa`和`$bbb`的值进行了判断,要求它们必须都等于`114514`并且不相等。如果满足这个条件,分别将字符串`'cancanwordflag'`和`'hacker!'`赋值给变量`$give`和`$get`。

这个也很好绕过,因为在进行等于判断的时候利用的是php弱比较,所以我们可以设置114514和114514a绕过

 代码检查`$_GET['flag']`和`$_POST['flag']`是否被设置。如果满足这个条件,就分别返回`$give`和`$get`的值,并结束脚本的执行。

 接下来,使用两个`foreach`循环遍历`$_POST`和`$_GET`数组,$$key用于创建与数组键名相同的变量,变量值为数组的值。

`$key`和`$value`分别代表数组元素的键和值。每次循环,`$key`和`$value`会被分别赋值为当前数组元素的键和值。

13. 最后,代码输出`$flag`的值。但是前面并没有设定flag结合foreach循环和前面判断语句的含义,这里是要传参一个flag=flag才回回显最终的flag信息,但是这里有对flag的传参进行了限制,但是也只对flag的传参进行了限制

也就是说,对于其他变量的传参并没有做任何限制,那么我们可以先将另一个变量的参数设置为flag,再赋值给flag变量作为flag变量的参数

$a=flag&flag=$a

最终payload

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值