CakePHP反序列化链:从原理到实战挖掘
字数 1702 2025-08-29 08:30:36
CakePHP反序列化漏洞分析与利用指南
1. CakePHP框架简介
CakePHP是一个基于PHP的开源Web应用框架,遵循MVC(模型-视图-控制器)设计模式,具有以下特点:
- 数据操作便捷,借助ORM减少SQL编写
- 支持高度自定义URL和灵活路由规则
- 内置验证机制保障数据安全
- 提供丰富视图助手工具
2. 反序列化基础概念
序列化与反序列化
- 序列化:将对象状态转换为可存储或传输格式(如字符串、字节流)
- 反序列化:将序列化数据还原为原始对象
PHP示例:
$user = ['name' => '张三', 'age' => 25];
$serialized = serialize($user); // 序列化
$unserialized = unserialize($serialized); // 反序列化
反序列化漏洞原理
当应用程序对不可信数据进行反序列化且缺乏有效验证时,攻击者可构造恶意序列化数据:
- 触发对象魔术方法(如
__destruct,__wakeup) - 利用方法中的不安全函数调用
- 可能导致任意代码执行、文件读取等危害
3. CakePHP反序列化链分析
3.x版本反序列化链(以3.9.6及之前为例)
利用链流程:
- 入口点:
vendor/symfony/process/Process.php的__destruct方法 - 调用链:
__destruct→stop→isRunning→updateStatus→readPipes→readAndWrite - 触发任意类的
__call方法(如vendor/cakephp/cakephp/src/ORM/Table.php) - 通过
BehaviorRegistry的call方法实现任意方法调用 - 最终利用
ServerShell的main方法执行系统命令
关键点:
- 控制
$this->status为"started"进入关键路径 - 通过
$this->_methodMap和$this->_loaded绕过检查 - 利用分号实现命令注入
POC示例:
// 3.x版本POC构造代码
4.x版本反序列化链(以4.2.3及之前为例)
变化点:
ServerShell类被修改,需要寻找新利用链- 新利用点在
CallbackStatement的动态调用
利用链流程:
- 通过
CallbackStatement的__invoke方法实现动态调用 - 控制
$this->statement->fetch($type)返回恶意参数 - 利用
BufferedStatement的fetch方法控制返回数据 - 最终实现任意方法执行(如
system)
POC示例:
// 4.x版本POC构造代码
5.x版本反序列化链(以5.1.4为例)
变化点:
Process.php新增__wakeup方法抛出异常- 需要寻找新入口点
利用链流程:
- 新入口点:
RejectedPromise.php的__destruct方法 - 触发
__toString→__call调用链 - 通过
BehaviorRegistry的call方法调用无参方法 - 利用
MapReduce的getIterator和_execute方法 - 通过
exec()执行系统命令
关键点:
- 控制
$this->reason触发__toString - 通过
ConstTypeNode触发__call - 控制
$mapper、$val和$key实现命令执行
POC示例:
// 5.x版本POC构造代码
4. 防御建议
- 输入验证:对反序列化数据进行严格验证
- 使用白名单:限制可反序列化的类
- 更新框架:及时升级到已修复版本
- 替代方案:使用JSON等更安全的序列化格式
- 魔术方法审查:检查
__destruct、__wakeup等方法的实现
5. 总结
CakePHP反序列化漏洞利用链随着版本演进而变化:
- 3.x版本:通过
Process→ServerShell链实现命令执行 - 4.x版本:通过
CallbackStatement→BufferedStatement链 - 5.x版本:通过
RejectedPromise→MapReduce链
理解这些利用链有助于安全开发和漏洞挖掘,开发者应关注框架安全更新并实施适当防护措施。