ctfshow新春欢乐赛某些题解


  • web2
    源码如下:

    点击查看代码
    <?php
    highlight_file(__FILE__);
    session_start();
    error_reporting(0);
    
    include "flag.php";
    
    if(count($_POST)===1){
            extract($_POST);
            if (call_user_func($$$$$${key($_POST)})==="HappyNewYear"){
                    echo $flag;
            }
    }
    ?>
    

可以POST传一个数组进去,而$$$$$${key($_POST)}这一段代码实际就是获得传进来的数组的key,也就是键值的值...然后作为call_user_func函数的参数。而我们需要该参数可控,可以传入一对键值相等的数组不就可以达到目的了,比如传入1=1,那么最后该参数一定是1,看到代码中有个session_start();,看了下cookie有个PHPSESSID,想到session_id()函数:

那么我们可以修改PHPSESSID=HappyNewYear,然后上传session_id=session_id就可以通过if了,下面是调试环节:

这是我修改一点后的本地复现代码:

点击查看代码
<?php
highlight_file(__FILE__);
session_start();
error_reporting(0);
$flag=123;
$sid = session_id();
if(count($_POST)===1){
        extract($_POST);
        $func = $$$$$${key($_POST)};
        if (call_user_func($func)==="HappyNewYear"){
                echo $flag;

        }
}

传入参数:

可以清楚看到每个环节的变量的值

CTF