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();
}
利用路径:
- 控制
$this->status绕过isRunning()检查 - 进入
stop()方法 - 触发
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;
}
总结与防御建议
技术总结
- 反序列化入口点选择至关重要,需绕过
__wakeup限制 - 利用PHP魔术方法(
__call)实现方法调用跳转 - 3.x和4.x版本需要采用不同的最终利用点
- 参数控制是构造利用链的关键环节
防御建议
- 及时更新框架版本
- 避免反序列化用户可控数据
- 对魔术方法进行严格参数检查
- 关键方法增加访问控制
研究价值
此研究揭示了:
- CakePHP框架内部调用机制的安全隐患
- PHP反序列化漏洞的通用挖掘方法
- 框架组件间交互可能带来的安全风险
通过深入分析框架内部实现,安全研究人员可以更好地理解反序列化漏洞的成因和利用方式,为框架安全性改进提供参考。