[CTF——Web]ezphp

MiracleWolf 2023-11-26 200 11/26

一、题目链接

ezphp

二、知识补充

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";

[CTF——Web]ezphp
可以发现$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 -

MiracleWolf

11月26日00:59

最后修改:2023年11月26日
0

非特殊说明,本博所有文章均为博主原创。