DVWA各级文件包含漏洞
File Inclusion文件包含漏洞
- 漏洞分析
-
程序开发人员通常会把可重复使用的函数写入到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写,这种调用文件的过程被称为包含。 有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞
-
- 可能存在漏洞的页面url
- 漏洞测试
- 文件包含函数
- require() 找不到被包含的文件时会产生致命错误,并停止脚本运行
- include() 找不到被包含的文件时只会产生警告,脚本将继续运行
- include_once()与include()类似 ,唯一区别时如果该文件中代码已经被包含,则不会再次包含
- require_one()与require()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含
Level:low
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
漏洞分析
low级别没有进行任何过滤;
- 第一步:构造url
127.0.0.1/dvwa/vulnerabilities/fi/?page=/etc/shadow
报错,显示没有这个文件,说明不是服务器系统不是Linux,但同时暴露了服务器文件的绝对路径
D:\Phpstudy\PHPTutorial\WWW\dvwa
- 第二步:通过绝对路径读取服务器的php.ini
其中'allow_url_fopen = on allow_url_include = on ' 文件包含都是打开的
可以通过..\保证到达服务器的C盘根目录
配置文件中的Magic_quote_gpc选项为off。在php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off时,我们可以在文件名中使用%00进行截断,也就是说文件名中%00后的内容不会被识别,即下面两个url是完全等效的。
使用%00截断可以绕过某些过滤规则,例如要求page参数的后缀必须为php,这时链接A会读取失败,而链接B可以绕过规则成功读取
Level: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://”、 ” ../”、”..\”替换为空字符,即删除
-
Sre_replace(函数)及其不安全,可以使用双写绕过替换规则
例如:page=hthttp://127.0.0.1/phpinfo.txt时,str_replace函数会将http://删除变成http://127.0.0.1/phpinfo成功执行
同时,因为替换的只是“../”、“..\”,所以对采用绝对路径的方式包含文件是不会受到任何限制的。
Level: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协议绕过防护策略。
构造url
什么时file协议
字面意思:本地文件传输协议
什么是File:
file协议主要用于访问本地计算机中的文件,好比通过Windows的资源管理器中打开文件或者通过右键单击‘打开’一样
file协议的基本格式如下:
file:///文件路径
file协议与http协议的区别
Level: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”之一,彻底杜绝了文件包含漏洞。