一、题目链接
二、知识补充
php变量污染,对于以下代码
<?php
$p = "QW";
$QW= "dddd";
echo $$p; //输出结果为 dddd
即用变量对应值作为新的变量。假设现在有一个敏感变量$flag
,并且无法直接对其进行修改,但是如果有一个变量:$temp=flag,而且存在一个操作:$$temp=$a,这就使得$flag的值被替换成变量$a的值,如果$a的值可以被我们控制的话,就可以修改敏感变量了。
三、解法步骤
首先审计代码:
<?php
highlight_file('source.txt');
$flag = 'xxxxxxxx';
$giveme = 'can can need flag!';
$getout = 'No! flag.Try again. Come on!';
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($giveme);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($getout);
}
foreach ($_POST as $key => $value) {
$$key = $value;
}
foreach ($_GET as $key => $value) {
$$key = $$value;
}
echo 'the flag is : ' . $flag;
?>
显然,我们需要让传入get或者post参数flag,但是如果传入flag,就无法通过下面的校验,同时注意到这里存在$$操作,那么我们考虑变量污染:
foreach ($_POST as $key => $value)
这条语句的作用是以键值对的形式遍历_POST数组,参考以下代码:
<?php
$flag="abc";
echo $flag."\n";
$c=["a"=>"flag","flag"=>"a"];
foreach($c as $key=>$value)
{
$$key=$$value;
echo ($key." ".$value."\n");
}
echo "$flag";
可以发现$flag的值被偷换成了a,在第一次循环中$a=flag,第二次循环中$flag=a,这就对原来的变量进行了污染。因此如果是POST传入参数的话,会导致原$flag被污染从而无法得到本题的答案。
但是如果是GET传入:$$key=$$value,可以简化成:$key=$value,如果$key与$value正好相反,那么操作就是互换,于是我们GET传入a=flag&&flag=a,这样就能避免检测到flag=flag,接着借用循环实现变量的互换。
Payload:?a=flag&&flag=a
四、总结
本题考的是php的变量污染,对理解$$变量有一定的要求。
- THE END -
最后修改:2023年11月26日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:http://47.98.239.98/2023/11/26/116/