DVWA File Inclusion

前言

File Inclusion文件包含,是指当服务器开启allow_url_include选项时,可以通过php的某些特性数include()require()include_once()require_once()利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。

文件包含分类

  • LFI:本地文件包含(Local File Inclusion)

  • RFI:远程文件包含(Remote File Inclusion)

    远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项,选项开启之后,服务器允许包含一个远程的文件。

与文件包含有关的函数

  • include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。
  • include_once():和 include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
  • require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。
  • require_once():和 require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。

相关的 php.ini 配置参数

1
2
allow_url_fopen = on (默认开启)
allow_url_include = on (默认关闭)

LOW

分析

1
2
3
4
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>

分析:

服务器端对page参数没有做任何的过滤跟检查。

服务器期望用户的操作是点击下面的三个链接,服务器会包含相应的文件,并将结果返回。

服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行。

如果文件内容确为php,则会正常执行并返回结果;

如果不是,则会原封不动地打印文件内容;

因此文件包含漏洞常常会导致任意文件读取与任意命令执行。

文件包含漏洞常常会导致任意文件读取与任意命令执行。现实中,恶意的攻击者是不会乖乖点击这些链接的,因此page参数是不可控的。

攻击测试

点击file1.php,观察到url为:http://localhost/DVWA/vulnerabilities/fi/?page=file1.php

利用漏洞构造url:http://localhost/DVWA/vulnerabilities/fi/?page=/Users/leeyuxun/WWW/dvwa/php.ini(绝对路径)

也可以构造url相对路径:http://localhost/DVWA/vulnerabilities/fi/?page=/?page=../../php.ini

MEDIUM

分析

1
2
3
4
5
6
7
 <?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()函数,对page参数进行了一定的处理,将http://https://../..\替换为空字符,只是过滤了远程包含,但没有过滤本地包含,可以使用本地绝对路径进行攻击;

注意:使用str_replace()函数是极其不安全的,可以使用双写绕过替换规则。例如page=htthttp://p://时,str_replace()函数会将http://删除,于是page=http://,成功执行远程命令;

HIGH

分析

1
2
3
4
5
6
7
8
9
10
<?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函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件;
代码规定只能包含file开头的文件,不过可以利用file协议绕过防护策略;

利用漏洞构造url:http://localhost/DVWA/vulnerabilities/fi/?page=file:///Users/leeyuxun/WWW/dvwa/php.ini

IMPOSSIBLE

分析

1
2
3
4
5
6
7
8
9
10
 <?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;
}
?>

分析:

使用了白名单机制进行防护,page参数必须为include.phpfile1.phpfile2.phpfile3.php之一,彻底杜绝了文件包含漏洞。