【web】php文件包含(利用phpinfo)

时间:2019-09-16
本文章向大家介绍【web】php文件包含(利用phpinfo),主要包括【web】php文件包含(利用phpinfo)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Docker搭建复现环境

地址:https://github.com/vulhub/vulhub/tree/master/php/inclusion

ps. github单独下载一个文件夹的方法:

安装:SVN

命令:sudo apt-get install subversion

如果想下载的文件夹链接是:https://github.com/vulhub/vulhub/tree/master/php/inclusion

那么改为:https://github.com/vulhub/vulhub/trunk/php/inclusion

命令行下载:svn checkout https://github.com/vulhub/vulhub/trunk/php/inclusion

下好了以后直接

docker-compose up -d

如果出现 AttributeError: 'module' object has no attribute 'SSL_ST_INIT' 问题:

rm -rf /usr/lib/python2.7/dist-packages/OpenSSL
rm -rf /usr/lib/python2.7/dist-packages/pyOpenSSL-0.15.1.egg-info
sudo pip install pyopenssl

复现

docker 执行完命令之后,直接访问网站 8080 端口会出现 phpinfo 界面

lfi.php?file=/etc/passwd 发现存在文件包含的

使用脚本进行 get shell:

python2 运行:python2 exp.py 192.168.149.133 8080 10(IP 端口 线程)

脚本报的结果:Got it! Sehll created in /tmp/g

所以使用:lfi.php?file=/tmp/g&1=system('ls'); 可以执行命令了!

漏洞原理

完全来自:https://github.com/vulhub/vulhub/tree/master/php/inclusion

大佬们写的太详细了,一看就懂,我就不胡说八道了

在给 php 发送 post 数据包的时候,如果数据包里面包含文件区块,无论访问的代码中有没有处理文件上传的逻辑,php 都会将这个文件保存成临时文件(通常是 /tmp/php[6个随机字符]),文件名可以通过在 $_FILES 这个变量中找到,这个临时文件,在请求结束后就会被删除

同时,因为 phpinfo 页面会将当前请求上下文所有变量都打印出来,所以我们如果向 phpinfo 页面发送包含文件区块的数据包,则可以在返回包里找到 $_FILES 变量的内容,自然也包含临时文件名

在文件包含找不到可利用的文件时,即可用这种方法(为什么我觉得这样一把梭更舒服?),找到临时文件名,然后包含

但是文件包含漏洞和 phpinfo 页面通常是两个页面,理论上我们需要先发数据包给 phpinfo 页面,然后从返回页面中匹配出临时文件名,再将这个文件名发送给文件包含漏洞页面,进行 getshell。在第一个请求结束时,临时文件就被删除了,第二个请求自然也无法包含

这时候需要用到条件竞争,具体流程如下:

1、发送包含 webshell 的上传数据给 phpinfo 页面,这个页面数据包的 header、get 等位置需要塞满垃圾数据

2、因为 phpinfo 页面会将所有数据都打印出来,第一步中的垃圾数据会使得 phpinfo 页面变得非常大

3、php 默认的输出缓冲区大小为 4096,可以理解为 php 每次返回 4096 个字节给 socket 连接

4、我们直接操作原生 socket,每次读取 4096 个字节,只要读取到的字符里面包含临时文件名,就立即发送第二个数据包

5、此时,第一个数据包的 socket 连接实际上还没有结束,因为 php 还在继续每次输出 4096 个字节,所以临时文件此时还没有删除

6、利用这个时间差,第二个数据包,也就是文件包含漏洞的利用,即可成功包含临时文件,最终 getshell

参考

https://github.com/vulhub/vulhub/tree/master/php/inclusion

原文地址:https://www.cnblogs.com/yichen115/p/11526989.html