type
Post
status
Published
date
slug
summary
tags
CTF
推荐
category
CTF-Knowledge
category (1)
icon
password
comment
前言:在newstar ctf2023中遇到了pearcmd文件包含的题,特此记录
利用条件
安装了pear扩展
php开启了
register_argc_argv选项(可以通过包含phpinfo.php文件进行查看)原理
php的pear扩展是一个命令行扩展管理工具,默认的安装路径在
/usr/local/lib/php/pearcmd.php,在命令行下可以用pear或php /usr/local/lib/php/pearcmd.php运行(相当于文件包含后利用),虽然不是在web的目录下,但是如果存在文件包含漏洞,我们就可以运行这个命令行工具我们再来看
register_argc_argv选项,在这个选项字段如果选了ON的话,URL中?后面的内容会全部传入至$_SERVER['argv']这个变量内,无论后面的内容是否有等号。pear会在
pearcmd.php获取命令行参数而pear获取命令行参数的函数
Consoles/Getopt.php->readPHPArgv()中会先尝试
$argv变量(这个变量储存在命令行模式下运行php脚本时传入的参数),然后再尝试$_SERVER['argv']变量,$_SERVER['argv']为我们可控的变量,这样,在文件包含的场景下,我们就可以运行pear命令行工具并用GET请求参数控制pear的命令行参数了。利用
接下来就是寻找可以利用的命令了
现在介绍三种利用手法
为了试验这几种方法我用docker在本地搭建了一个文件包含环境,镜像是
php:7.4-apacheconfig-create
此方法来自于p神博客
此命令的参数和用法如下
就是要我们输入两个参数,一个是绝对路径,还有保存配置文件的文件名
尝试一下使用以下这个命令看下效果

img
可以看见我们已经写入一个配置文件了,检查下内容

img
第一个参数的内容会被写入文件,如果我们将第一个参数换成文件内容的话我们就可以写入可包含的文件了
payload
这边要用burp传参,不然的话直接网站传参,像‘<’这种符号会被转化成为url编码,就不能执行一句话木马了

img
包含结果:

img
我们来看下写入的文件

img
可以看见
/&file=/usr/local/lib/php/pearcmd.php&/<?=@eval($_POST['cmd']);?>整个被作为参数传入了命令行,但是get参数file被正常解析了,这是因为前面说过的即使URL中存在等号,问号后的内容一样会被传入$_SERVER['argv']install
此方法来自jrXnm师傅的博客
先来看看install的常规用法:
我在我vps上挂了一个php文件
然后通过pear下载
结果:
结果在
/tmp/pear/download/目录下有一个test1.php然后
install有--installroot这个选项可以指定他的安装目录,这里可以构造payload远程下载我们的文件了这个要被包含的文件就在web目录的
&file=/usr/local/lib/php/pearcmd.php\&/tmp/pear/download/下,我们把路径url编码一下再包含
img
成功了
download
先查看一下download的用法
尝试一下下恶意的php文件
虽然提示下载失败,但是直接当前目录留下了php文件

img
我们可以尝试一下利用这个
download我构造的payload为
当然我提前在服务器上构造好了目录:
test1.php&file=/usr/local/lib/php/,将恶意php命名为pearcmd.php其实可以去掉前面的test1.php,只要在服务器上创建相应的目录就行
然后直接访问
pearcmd.php,成功- 作者:qetx
- 链接:http://qetx.top/article/6cec5b3e-0ce1-45fc-b259-5ca01343d767
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。








