CakePHP 新版 RCE 调用分析寻找
字数 1283 2025-08-22 12:23:19
CakePHP 新版 RCE 调用链分析与利用
前言
本文详细分析 CakePHP 框架中反序列化漏洞的利用链构造方法,涵盖 3.x、4.x 和 5.x 版本的 RCE (远程代码执行) 漏洞利用技术。通过分析历史版本利用链,我们可以理解新版本漏洞的发现思路。
环境搭建
- 使用小皮面板快速搭建测试环境
- 对于 5.1.4 版本,需要根据提供的 Dockerfile 替换相应文件
老版本利用链分析
3.x ≤ 3.9.6 版本
调用链分析
-
入口点:
Process类的__destruct方法public function __destruct(){ if ($this->options['create_new_console'] ?? false) { $this->processPipes->close(); } else { $this->stop(0); } } -
调用链流转:
- 进入
stop方法 - 调用
isRunning方法 - 进入
updateStatus方法 - 调用
readPipes方法
- 进入
-
关键调用点:
private function readPipes(bool $blocking, bool $close){ $result = $this->processPipes->readAndWrite($blocking, $close); // ... }processPipes可控,可调用任意类的readAndWrite方法
-
寻找可利用的类:
Table类的__call方法:public function __call($method, $args){ if ($this->_behaviors && $this->_behaviors->hasMethod($method)) { return $this->_behaviors->call($method, $args); } // ... }BehaviorRegistry类的call方法:public function call($method, array $args = []){ // ... return call_user_func_array([$this->_loaded[$behavior], $callMethod], $args); }
-
最终利用点:
ServerShell类的main方法:public function main(){ $command = sprintf('php -S %s:%d -t %s', $this->_host, $this->_port, escapeshellarg($this->_documentRoot)); // ... system($command); }- 通过控制
_host、_port和_documentRoot参数实现命令注入
4.x ≤ 4.2.3 版本
- 主要变化是
ServerShell类被修改 - 新利用点:
CallbackStatement类- 可以调用任意的
fetch方法
- 可以调用任意的
- 使用
BufferedStatement类:$this->buffer、$this->index、$this->_allFetched可控$row参数可控
SUCTF 新版本 (5.1.4)
调用链分析
-
新入口点:
RejectedPromise类的__destruct方法- 进行字符串拼接,触发
__toString方法
- 进行字符串拼接,触发
-
中间转换点:
Cake\Http\Response类- 作为中间点触发
__call方法
- 作为中间点触发
-
利用
Table类的__call方法:- 与老版本相同,调用
BehaviorRegistry的call方法
- 与老版本相同,调用
-
最终利用点:
MockClass类- 通过控制
MockClass执行任意命令
- 通过控制
POC 构造要点
- 控制
RejectedPromise的reason属性指向Response对象 Response对象触发__toString- 通过
Table和BehaviorRegistry的调用链 - 最终到达
MockClass执行命令
总结
CakePHP 反序列化漏洞利用的关键点:
- 寻找合适的入口点 (
__destruct或__wakeup) - 分析调用链流转过程
- 识别可控参数的关键类和方法
- 构造从入口点到最终执行点的完整调用链
- 针对不同版本调整利用点
新版本漏洞通常是对老版本调用链的修改或阻断,通过分析历史版本利用链可以更快地发现新版本的利用方法。