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容器中查看文件是否成功上传

成功上传虽然有乱码但是代码已经传递上去

尝试包含所写如文件

包含成功

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值