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); // 反序列化

反序列化漏洞原理

当应用程序对不可信数据进行反序列化且缺乏有效验证时,攻击者可构造恶意序列化数据:

  1. 触发对象魔术方法(如__destruct, __wakeup
  2. 利用方法中的不安全函数调用
  3. 可能导致任意代码执行、文件读取等危害

3. CakePHP反序列化链分析

3.x版本反序列化链(以3.9.6及之前为例)

利用链流程

  1. 入口点:vendor/symfony/process/Process.php__destruct方法
  2. 调用链:__destructstopisRunningupdateStatusreadPipesreadAndWrite
  3. 触发任意类的__call方法(如vendor/cakephp/cakephp/src/ORM/Table.php
  4. 通过BehaviorRegistrycall方法实现任意方法调用
  5. 最终利用ServerShellmain方法执行系统命令

关键点

  • 控制$this->status为"started"进入关键路径
  • 通过$this->_methodMap$this->_loaded绕过检查
  • 利用分号实现命令注入

POC示例

// 3.x版本POC构造代码

4.x版本反序列化链(以4.2.3及之前为例)

变化点

  • ServerShell类被修改,需要寻找新利用链
  • 新利用点在CallbackStatement的动态调用

利用链流程

  1. 通过CallbackStatement__invoke方法实现动态调用
  2. 控制$this->statement->fetch($type)返回恶意参数
  3. 利用BufferedStatementfetch方法控制返回数据
  4. 最终实现任意方法执行(如system

POC示例

// 4.x版本POC构造代码

5.x版本反序列化链(以5.1.4为例)

变化点

  • Process.php新增__wakeup方法抛出异常
  • 需要寻找新入口点

利用链流程

  1. 新入口点:RejectedPromise.php__destruct方法
  2. 触发__toString__call调用链
  3. 通过BehaviorRegistrycall方法调用无参方法
  4. 利用MapReducegetIterator_execute方法
  5. 通过exec()执行系统命令

关键点

  • 控制$this->reason触发__toString
  • 通过ConstTypeNode触发__call
  • 控制$mapper$val$key实现命令执行

POC示例

// 5.x版本POC构造代码

4. 防御建议

  1. 输入验证:对反序列化数据进行严格验证
  2. 使用白名单:限制可反序列化的类
  3. 更新框架:及时升级到已修复版本
  4. 替代方案:使用JSON等更安全的序列化格式
  5. 魔术方法审查:检查__destruct__wakeup等方法的实现

5. 总结

CakePHP反序列化漏洞利用链随着版本演进而变化:

  • 3.x版本:通过ProcessServerShell链实现命令执行
  • 4.x版本:通过CallbackStatementBufferedStatement
  • 5.x版本:通过RejectedPromiseMapReduce

理解这些利用链有助于安全开发和漏洞挖掘,开发者应关注框架安全更新并实施适当防护措施。

CakePHP反序列化漏洞分析与利用指南 1. CakePHP框架简介 CakePHP是一个基于PHP的开源Web应用框架,遵循MVC(模型-视图-控制器)设计模式,具有以下特点: 数据操作便捷,借助ORM减少SQL编写 支持高度自定义URL和灵活路由规则 内置验证机制保障数据安全 提供丰富视图助手工具 2. 反序列化基础概念 序列化与反序列化 序列化 :将对象状态转换为可存储或传输格式(如字符串、字节流) 反序列化 :将序列化数据还原为原始对象 PHP示例: 反序列化漏洞原理 当应用程序对不可信数据进行反序列化且缺乏有效验证时,攻击者可构造恶意序列化数据: 触发对象魔术方法(如 __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示例 : 4.x版本反序列化链(以4.2.3及之前为例) 变化点 : ServerShell 类被修改,需要寻找新利用链 新利用点在 CallbackStatement 的动态调用 利用链流程 : 通过 CallbackStatement 的 __invoke 方法实现动态调用 控制 $this->statement->fetch($type) 返回恶意参数 利用 BufferedStatement 的 fetch 方法控制返回数据 最终实现任意方法执行(如 system ) 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示例 : 4. 防御建议 输入验证 :对反序列化数据进行严格验证 使用白名单 :限制可反序列化的类 更新框架 :及时升级到已修复版本 替代方案 :使用JSON等更安全的序列化格式 魔术方法审查 :检查 __destruct 、 __wakeup 等方法的实现 5. 总结 CakePHP反序列化漏洞利用链随着版本演进而变化: 3.x版本:通过 Process → ServerShell 链实现命令执行 4.x版本:通过 CallbackStatement → BufferedStatement 链 5.x版本:通过 RejectedPromise → MapReduce 链 理解这些利用链有助于安全开发和漏洞挖掘,开发者应关注框架安全更新并实施适当防护措施。