#免责声明: 本文属于个人笔记,仅用于学习,禁止使用于任何违法行为,任何违法行为与本人无关。
漏洞原理
File Inclusion,意思是文件包含(漏洞),是指当服务器开启alLow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的alLow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。
漏洞危害
1、敏感信息泄露 2、获取Webshell 3、任意命令执行
防御措施
1、设置白名单 代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。 2、过滤危险字符 由于Include/Require可以对PHP Wrapper形式的地址进行包含执行(需要配置php.ini),在Linux环境中可以通过”…/…/”的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP文件。 3、置文件目录 PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件。 4、关闭危险配置 PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。
靶场实战
Low难度
源码分析
<?php
$file = $_GET[ 'page' ];
?>
这里的low难度源码中未做任何过滤,可以直接获取page参数
漏洞复现
可以看到DVWA要求是通过文件包含,来调用file1.php/file2.php/file3.php,点击file1发现url中的page参数值就是file1。 接下来可以利用漏洞来暴露www路径获取里面得phpinfo.php:
Medium难度
源码分析
<?php
$file = $_GET[ 'page' ];
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
可以看到源码对"http://", “https://” “…/”, “…” 进行了过滤,不过这样过滤黑名单可以经过简单的绕过
漏洞复现
通过”htthttp://p://” ,”…/./”就会绕过这个黑名单,如下图获取phpinfo.php: 然如果知道phpinfo.php的绝对路径都不用绕过就可以直接访问如low难度中所示。
High难度
源码分析
<?php
$file = $_GET[ 'page' ];
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
echo "ERROR: File not found!";
exit;
}
?>
可以看到源码中含有fnmatch()函数,而这个函数是用来匹配字符串的,限定了$file变量的开头只能是file开头,这样做看似安全,其实可以使用file协议绕过这个限制。
漏洞复现
FIle协议基本格式:file:///文件路径
Impossible难度
源码分析
<?php
$file = $_GET[ 'page' ];
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
echo "ERROR: File not found!";
exit;
}
?>
这里直接使用了白名单过滤,使page参数值只能为“include.php”、“file1.php”、“file2.php”、“file3.php”之一,彻底杜绝了文件包含漏洞。
又是朴实无华的一天!!!!!!!!!!!!
参考文章:http://t.csdn.cn/h46YP
|