宸极实验室——『代码审计』从零开始的 Yii2 框架学习之旅

发布网友 发布时间:2024-12-17 06:38

我来回答

1个回答

热心网友 时间:2025-01-18 08:00

Yii2 框架反序列化漏洞新手学习记录

前言:Yii2 是一个高性能、基于组件的开源 PHP 框架,适用于快速开发现代 Web 应用程序。近年来,该框架的花样反序列化漏洞在 CTF 比赛和攻防演练中频繁出现。

2020年9月14日,Yii Framework 2 发布了更新,揭示了一个反序列化远程命令执行漏洞,编号为 CVE-2020-15148。本文将带你从这里开始,学习如何探索这个漏洞。

前期准备:了解 PHP 基础、反序列化原理、类与对象、命名空间概念。可以通过 GitHub 下载影响版本的代码包并进行测试环境搭建。安装步骤包括下载代码包、解压、配置 cookieValidationKey 等。使用 Composer 可以更便捷地安装。

搭建成功后,添加反序列化漏洞入口。通过访问特定路径,进行测试。

漏洞分析及复现:从官方更新日志找到线索,发现漏洞影响文件是 yii2/db/BatchQueryResult.php。通过 GitHub commit 对比分析,发现该版本添加了禁止反序列化的魔术方法 __wakeup()。分析起点为该类,列出了常见魔术方法,并开始正式分析。

打开文件,删除代码和注释后,发现反序列化时触发 reset 方法,关闭_dataReader 对象。这可以分为两种情况:触发 __call() 魔术方法或调用 close 方法。通过调用其他危险函数,形成 POP 链。

查找含有 __call() 魔术方法的类,发现组件类不适用,StreamDecoratorTrait 类无法实例化,但 ValidGenerator 类中存在潜在危险。测试发现存在警告信息,进一步分析,发现可通过执行类中的方法实现控制。最终筛选出 Generator 类作为深入分析对象。

通过构造 POP 链,成功执行 phpinfo() 函数。虽然只能执行无参数函数,但通过查找 Yii2 自身代码中可代码执行的点,结合 call_user_func 函数,构建了新的 POP 链,实现命令执行。

总结:完整复现 MVC 框架的反序列化漏洞,从头开始分析,学习了许多以前不注意的细节。本文仅供安全研究与讨论,严禁用于非法用途。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com