参考《白帽子讲web安全》,实验心得:
想要成功利用文件包含的漏洞,需要满足两个条件
(1)include()等函数通过动态变量的方式引入需要包含的文件
(2)用户能够控制该动态变量
以DVWA的文件包含来做实验
实验环境:
DVWA,win10,wampserver2.4-x86,中国菜刀等
本地文件包含漏洞
当用户可以控制page参数时,我们可以进行查看我们任意想要查看的文件。即目录遍历。因为wamp的php.ini文件默认情况下allow_url_fopen=on
![](https://img.haomeiwen.com/i1734768/39a5f7afdd7c3c87.png)
![](https://img.haomeiwen.com/i1734768/ef9c4d86eb6d7514.png)
![](https://img.haomeiwen.com/i1734768/4d25196d13752fb7.png)
使用../../的方式来返回上层目录。当然也采用不同的编码来进行绕过一些限制。
文件包含的防护
当php采用了open_basedir,它用来限制特定目录php能打开的文件。
在php.ini中默认是没有打开的。
![](https://img.haomeiwen.com/i1734768/1ed083bab57aeba6.png)
我们对其进行设置,任意文件包含就会失败
![](https://img.haomeiwen.com/i1734768/db235fae23e98d08.png)
如果是要限制一个指定的目录,最后一定要加上\
远程文件包含
默认情况下php.ini的配置选项allow_url_include=off,不能远程文件,我们手动设置为on,以方便我们的实验
![](https://img.haomeiwen.com/i1734768/ade34d7aea7552e0.png)
![](https://img.haomeiwen.com/i1734768/82152a621c41c5ea.png)
我们还可以利用文件包含漏洞执行任意命令,需要借助另一台服务器,我利用虚拟机的win7来让实验更加完美,虚拟机IP为192.168.15.156,我们新建一个文件hack.txt,代码为:
![](https://img.haomeiwen.com/i1734768/110b73ca5e4edbb6.png)
注:创建的文件后缀名一定是txt、jpg、rar,一定是非php文件后缀名的文件,进而getshell
然后我们控制page参数来访问我们构建的脚本
![](https://img.haomeiwen.com/i1734768/9083c26dff5b1246.png)
我们可看到在本机win10的dvwa下新建了一个文件sheller.php
![](https://img.haomeiwen.com/i1734768/e2e158d3e0e65caa.png)
访问sheller.php
![](https://img.haomeiwen.com/i1734768/1782f03f42032d26.png)
那么我们可以把hack.txt代码进行修改,和中国菜刀相结合
![](https://img.haomeiwen.com/i1734768/cfed97f24becd00e.png)
再次访问,并使用菜刀,成功利用。
![](https://img.haomeiwen.com/i1734768/278ee39ff92562cf.png)
![](https://img.haomeiwen.com/i1734768/2a32c927aedf3684.png)
![](https://img.haomeiwen.com/i1734768/a8f39c90c5c66dbe.png)
我们还有别的思路,都可以进行尝试
比如在hack.php文件里,写以下代码
![](https://img.haomeiwen.com/i1734768/b7eb6f1b8875fabc.png)
![](https://img.haomeiwen.com/i1734768/8a3aa95c40a98a3b.png)
![](https://img.haomeiwen.com/i1734768/d0951ac0b7ceb714.png)
注意:$_POST和$_GET的传递方式不一样。
本地文件包含的利用技巧
1. php://input是可以访问请求原始数据的只读流。
可以读取到post没有解析的原始数据
![](https://img.haomeiwen.com/i1734768/c2192c93c9bb3b0f.png)
2. php://filter读取包含漏洞脚本的源码
php://filter/read=convert.base64-encode/resource=[文件路径]
![](https://img.haomeiwen.com/i1734768/02547a4f353857e4.png)
![](https://img.haomeiwen.com/i1734768/f98aaff95e16e96b.png)
读取index.php文件,再使用base64进行解码。
3. data URL schema将文件包含漏洞变成代码进行执行漏洞
data:text/plain,<?php system('ipconfig');?>
![](https://img.haomeiwen.com/i1734768/c43bc61e176800ce.png)
![](https://img.haomeiwen.com/i1734768/889c770a0a164f97.png)
4. 包含apache配置文件
首先利用burpsuite进行抓包访问,将想要执行的php代码插入其中,避免<、>等符号被过滤,随后访问access.log,执行代码。
(我使用的wampserver,access.log默认在wamp/logs/access.log)
![](https://img.haomeiwen.com/i1734768/a195a824fdf1f6c0.png)
![](https://img.haomeiwen.com/i1734768/5c081e770234c9af.png)
![](https://img.haomeiwen.com/i1734768/fb8053daaf98de24.png)
5. file:// 协议查看任意文件
![](https://img.haomeiwen.com/i1734768/4f6e5d60377890c0.png)
6. zip:// 协议
zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件。可以被php解析的子文件后缀名
![](https://img.haomeiwen.com/i1734768/7f3babb7fd71f8be.png)
还有其他一些协议的利用:
php://stdin 是只读的, php://stdout 和 php://stderr 是只写的,ftp://访问ftp
expect://协议执行任意linux的指令,使用http://localhost/include.php?page=expect://command
来执行任意linux指令
总结:
文件包含漏洞即是类似include函数在包含文件的时候,使用GET或POST请求方式,使得参数有可能被控制。
所以出现文件包含漏洞
如:
![](https://img.haomeiwen.com/i1734768/8eee6a1f0faa6142.png)
参考文献:
网友评论