GDOUCTF

1[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 "别来沾边";
}

其中这个函数的意义是这样的
foreach ($_POST as $key => $value) {
$$key = $value;
将上传的post分为$key和 $value两个部分
如上传1=flag
那么$key=1 $value=flag
$$key=$value这里相当于
$flag=$value
也就是$1=flag
之后
foreach ($_GET as $key => $value) {
$$key = $$value;
上传1=flag
可以得到$1=$flag
上传flag=1
得到$flag=$1
也就相当于$flag=$flag
这样就绕过了变量覆盖
就可以执行echo $flag
得到flag
1681984397(1).png

posted @ 2023-08-17 21:58  Sdegree  阅读(29)  评论(0编辑  收藏  举报