GDOUCTF
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
- 感谢你赐予我前进的力量