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 版本

调用链分析

  1. 入口点: Process 类的 __destruct 方法

    public function __destruct(){
        if ($this->options['create_new_console'] ?? false) {
            $this->processPipes->close();
        } else {
            $this->stop(0);
        }
    }
    
  2. 调用链流转:

    • 进入 stop 方法
    • 调用 isRunning 方法
    • 进入 updateStatus 方法
    • 调用 readPipes 方法
  3. 关键调用点:

    private function readPipes(bool $blocking, bool $close){
        $result = $this->processPipes->readAndWrite($blocking, $close);
        // ...
    }
    
    • processPipes 可控,可调用任意类的 readAndWrite 方法
  4. 寻找可利用的类:

    • 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);
      }
      
  5. 最终利用点:

    • 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)

调用链分析

  1. 新入口点: RejectedPromise 类的 __destruct 方法

    • 进行字符串拼接,触发 __toString 方法
  2. 中间转换点: Cake\Http\Response

    • 作为中间点触发 __call 方法
  3. 利用 Table 类的 __call 方法:

    • 与老版本相同,调用 BehaviorRegistrycall 方法
  4. 最终利用点: MockClass

    • 通过控制 MockClass 执行任意命令

POC 构造要点

  1. 控制 RejectedPromisereason 属性指向 Response 对象
  2. Response 对象触发 __toString
  3. 通过 TableBehaviorRegistry 的调用链
  4. 最终到达 MockClass 执行命令

总结

CakePHP 反序列化漏洞利用的关键点:

  1. 寻找合适的入口点 (__destruct__wakeup)
  2. 分析调用链流转过程
  3. 识别可控参数的关键类和方法
  4. 构造从入口点到最终执行点的完整调用链
  5. 针对不同版本调整利用点

新版本漏洞通常是对老版本调用链的修改或阻断,通过分析历史版本利用链可以更快地发现新版本的利用方法。

CakePHP 新版 RCE 调用链分析与利用 前言 本文详细分析 CakePHP 框架中反序列化漏洞的利用链构造方法,涵盖 3.x、4.x 和 5.x 版本的 RCE (远程代码执行) 漏洞利用技术。通过分析历史版本利用链,我们可以理解新版本漏洞的发现思路。 环境搭建 使用小皮面板快速搭建测试环境 对于 5.1.4 版本,需要根据提供的 Dockerfile 替换相应文件 老版本利用链分析 3.x ≤ 3.9.6 版本 调用链分析 入口点 : Process 类的 __destruct 方法 调用链流转 : 进入 stop 方法 调用 isRunning 方法 进入 updateStatus 方法 调用 readPipes 方法 关键调用点 : processPipes 可控,可调用任意类的 readAndWrite 方法 寻找可利用的类 : Table 类的 __call 方法: BehaviorRegistry 类的 call 方法: 最终利用点 : ServerShell 类的 main 方法: 通过控制 _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 ) 分析调用链流转过程 识别可控参数的关键类和方法 构造从入口点到最终执行点的完整调用链 针对不同版本调整利用点 新版本漏洞通常是对老版本调用链的修改或阻断,通过分析历史版本利用链可以更快地发现新版本的利用方法。