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

img