CakePHP反序列化POP链挖掘
字数 1493 2025-08-05 00:15:18

CakePHP反序列化POP链挖掘技术分析

前言

本文详细分析CakePHP框架中的反序列化POP(Property-Oriented Programming)链挖掘技术,涵盖3.x和4.x版本的利用方法。通过研究PHP函数调用特性和框架内部机制,揭示如何构造有效的反序列化利用链。

PHP函数调用特性分析

有参无参调用特性

class a{
    public function aaa($a){
        echo 'aaa';
    }
    public function cccc(){
        echo 'cccc';
    }
}
$a = new a();
$a->aaa();
$a->cccc(123,456);

关键发现:

  • PHP ≤ 7.0.33:有参函数可以无参调用(产生Warning但不中断执行)
  • PHP ≥ 7.1.0:有参函数无参调用会导致Fatal error
  • 无参函数可以有参调用

反序列化入口点分析

第一处潜在入口 - SmtpTransport.php

路径:vendor/cakephp/cakephp/src/Mailer/Transport/SmtpTransport.php

public function __destruct() {
    try {
        $this->disconnect();
    } catch (Throwable $e) {
    }
}

限制:

  • __wakeup()方法会重置$this->_socket为null
  • 对应CVE-2019-11458,已在3.7.7和4.x初始版本修复

第二处有效入口 - Process.php

路径:vendor/symfony/process/Process.php

public function __destruct() {
    if ($this->isRunning()) {
        $this->stop(0);
    }
}

版本限制:

  • 4.x ≤ 4.2.3
  • 3.x ≤ 3.9.6

旧版本__destruct实现:

public function __destruct() {
    $this->stop();
}

利用路径:

  1. 控制$this->status绕过isRunning()检查
  2. 进入stop()方法
  3. 触发readAndWrite()调用,进而触发__call魔术方法

3.x版本利用链(以3.9.6为例)

__call方法利用点

路径:vendor/cakephp/cakephp/src/ORM/Table.php

public function __call($method, $args) {
    if ($this->behaviors()->hasMethod($method)) {
        return $this->behaviors()->call($method, $args);
    }
}

BehaviorRegistry调用链

路径:vendor/cakephp/cakephp/src/ORM/BehaviorRegistry.php

public function call($method, array $args = []) {
    $object = $this->get($method);
    return call_user_func_array([$object, $method], $args);
}

最终利用点 - ServerShell.php

路径:vendor/cakephp/cakephp/src/Shell/ServerShell.php

public function main() {
    $command = escapeshellcmd(PHP_BINARY) . ' -S ' . $this->host . ':' . $this->port;
    system($command);
}

利用条件:

  • 通过__call调用main方法
  • 命令注入可通过分号(;)实现多命令执行
  • Windows环境需要PHP环境变量

4.x版本利用链(以4.1.6为例)

ServerShell替代方案

由于4.x移除了ServerShell,改用ServerCommand.php,需要寻找新的利用点。

CallbackStatement利用点

路径:vendor/cakephp/cakephp/src/Database/Statement/CallbackStatement.php

public function __call($method, $args) {
    $callback = [$this->callback, $method];
    return call_user_func_array($callback, $args);
}

BufferedStatement利用链

路径:vendor/cakephp/cakephp/src/Database/Statement/BufferedStatement.php

public function fetch($type = 'num') {
    $result = $this->statement->fetch($type);
    if ($result && $this->hydrate) {
        $result = $this->hydrator->hydrate($result, $this->map);
    }
    return $result;
}

总结与防御建议

技术总结

  1. 反序列化入口点选择至关重要,需绕过__wakeup限制
  2. 利用PHP魔术方法(__call)实现方法调用跳转
  3. 3.x和4.x版本需要采用不同的最终利用点
  4. 参数控制是构造利用链的关键环节

防御建议

  1. 及时更新框架版本
  2. 避免反序列化用户可控数据
  3. 对魔术方法进行严格参数检查
  4. 关键方法增加访问控制

研究价值

此研究揭示了:

  • CakePHP框架内部调用机制的安全隐患
  • PHP反序列化漏洞的通用挖掘方法
  • 框架组件间交互可能带来的安全风险

通过深入分析框架内部实现,安全研究人员可以更好地理解反序列化漏洞的成因和利用方式,为框架安全性改进提供参考。

CakePHP反序列化POP链挖掘技术分析 前言 本文详细分析CakePHP框架中的反序列化POP(Property-Oriented Programming)链挖掘技术,涵盖3.x和4.x版本的利用方法。通过研究PHP函数调用特性和框架内部机制,揭示如何构造有效的反序列化利用链。 PHP函数调用特性分析 有参无参调用特性 关键发现: PHP ≤ 7.0.33:有参函数可以无参调用(产生Warning但不中断执行) PHP ≥ 7.1.0:有参函数无参调用会导致Fatal error 无参函数可以有参调用 反序列化入口点分析 第一处潜在入口 - SmtpTransport.php 路径: vendor/cakephp/cakephp/src/Mailer/Transport/SmtpTransport.php 限制: __wakeup() 方法会重置 $this->_socket 为null 对应CVE-2019-11458,已在3.7.7和4.x初始版本修复 第二处有效入口 - Process.php 路径: vendor/symfony/process/Process.php 版本限制: 4.x ≤ 4.2.3 3.x ≤ 3.9.6 旧版本 __destruct 实现: 利用路径: 控制 $this->status 绕过 isRunning() 检查 进入 stop() 方法 触发 readAndWrite() 调用,进而触发 __call 魔术方法 3.x版本利用链(以3.9.6为例) __ call方法利用点 路径: vendor/cakephp/cakephp/src/ORM/Table.php BehaviorRegistry调用链 路径: vendor/cakephp/cakephp/src/ORM/BehaviorRegistry.php 最终利用点 - ServerShell.php 路径: vendor/cakephp/cakephp/src/Shell/ServerShell.php 利用条件: 通过 __call 调用 main 方法 命令注入可通过分号(;)实现多命令执行 Windows环境需要PHP环境变量 4.x版本利用链(以4.1.6为例) ServerShell替代方案 由于4.x移除了ServerShell,改用 ServerCommand.php ,需要寻找新的利用点。 CallbackStatement利用点 路径: vendor/cakephp/cakephp/src/Database/Statement/CallbackStatement.php BufferedStatement利用链 路径: vendor/cakephp/cakephp/src/Database/Statement/BufferedStatement.php 总结与防御建议 技术总结 反序列化入口点选择至关重要,需绕过 __wakeup 限制 利用PHP魔术方法( __call )实现方法调用跳转 3.x和4.x版本需要采用不同的最终利用点 参数控制是构造利用链的关键环节 防御建议 及时更新框架版本 避免反序列化用户可控数据 对魔术方法进行严格参数检查 关键方法增加访问控制 研究价值 此研究揭示了: CakePHP框架内部调用机制的安全隐患 PHP反序列化漏洞的通用挖掘方法 框架组件间交互可能带来的安全风险 通过深入分析框架内部实现,安全研究人员可以更好地理解反序列化漏洞的成因和利用方式,为框架安全性改进提供参考。