Docker php文件本地包含--pearcmd.php利用
目录
前言
环境搭建
pearcmd.php巧妙利用
渗透
前言
docker包含日志文件,基本不可能,就以我自身的一个项目来说,在尝试包含日志文件时发现,客户将他的日志文件从定向到了设备文件,而php没有包含设备文件的权限
然后我们就想如何包含,发现客户的文件目录里有一个phpinfo(),然后可以使用phpinfo实现临时文件的包含。但是这个包含的成功率经测试不是很高。
所以我们这里再说一个新招
环境搭建
docker环境直接拉就可以了,然后会将你的当前目录映射到docker容器中
docker run -d --name web -p 8080:80 -v $(pwd):/var/www/html php:7.4-apache
pearcmd.php巧妙利用
pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。在7.3及以前,pecl/pear是默认安装的;在7.4及以后,需要我们在编译PHP的时候指定--with-pear
才会安装。
docker环境中是有这个文件的如下图
原本pear/pcel是一个命令行工具,并不在Web目录下,我们是访问不到的。但我们遇到的场景比较特殊,是一个文件包含的场景,只要我们可以猜到路径,那么我们就可以包含到pear中的文件,进而利用其中的特性来搞事。
如何利用
下面来看一下register_argc_argv这个配置,这个配置子docker的php环境中是默认开启的如下图所示,那这么个东西有啥子用,不急我们接着往下看
当开启了register_argc_argv这个选项,用户的输入将会被赋予给$argc
、$argv
、$_SERVER['argv']
几个变量
如果PHP以server形式运行,且他有$_SERVER变量,而且开启了register_argc_argv这个选项,且request_info.argc不存在,就会出现http数据包中的query-string就会被作为$_server['argv']的值。我们来看一下
pear中获取命令行argv的函数,他是先获取$argv,如果argv不存在再尝试$_SERVER['argv],我们可通过query-string控制$_SERVER['argv]。 然后pear中会有一个可以利用的参数config-create,这个命令需要传入两个参数,其中第二个参数是写入的文件路径,第一个参数会被写入到这个文件中。我们在query-string中传递config-create,这个东西就会被pearcmd.php调用。然后pearcmd.php两个参数在通过query-string进行获取。这样我们可以构造如下payload。注意config-create前面有一个空格不能忘记
config-create /&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?> /tmp/hello.php
/&file=/usr/local/lib/php/pearcmd.php 要包含的文件
<?=phpinfo()?> 要包含的内容
/tmp/hello.php要写入的文件
渗透
抓包传值
我们进入docker容器中查看文件是否成功上传
成功上传虽然有乱码但是代码已经传递上去
尝试包含所写如文件
包含成功