DVWA File Inclusion 文件包含全等级分析与实践:
文件包含函数的参数没有经过过滤或者严格的定义,并且参数可以被用户控制,这样就可能包含非预期文件。如果文件中存在恶意代码,无论文件是什么类型,文件内的恶意代码都会被解析并执行。几乎所有的脚本语言中都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多。
文件包含原理:
PHP中提供了四个文件包含的函数,分别是include()、include_once()、require()和require_once()。这四个函数都可以进行文件包含,但作用并不一样。
require:找不到被包含的文件时会产生致命错误,并停止脚本。
include:找不到被包含的文件时只会产生警告,脚本将继续执行。
include_once:和include()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。 require_once:和require()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
文件包含分类:
PHP中的文件包含分为本地包含和远程包含。
(一)本地包含 Local File Include (LFI)
1、所包含文件内容符合PHP语法规范:任何扩展名都可以被PHP解析。
2、包含非PHP语法规范源文件,会暴露其源代码。
(二)远程包含 Remote File Include (RFI)
如果要使用远程包含功能,首先需要确定PHP是否已经开启远程包含功能选项(php默认关闭远程包含功能:allow_url_include=off),开启远程包含功能需要在php.ini配置文件中修改。
远程包含与本地包含没有区别,无论是哪种扩展名,只要遵循PHP语法规范,PHP解析器就会对其解析。
危害:
1.web服务器的文件被外界浏览,导致敏感信息泄露
2.脚本被任意执行,导致网站被篡改
Low:
查看源码:
源码中暴露的问题:
page参数没有做任何过滤,直接被include函数包含,造成文件包含漏洞产生
先查看一下三个文件地内容:
访问http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=..\..\php.ini
Medium:
查看源码:
分析:
Medium级别的代码增加了str_replace函数,对page参数进行了一定的过滤,将”http:// ”、”https://”、 ” ../”、”..\“”替换为空字符。但str_replace函数并不是很安全,双写就可以绕过了,而且” ../”、”..\”替换为空字符,那么绝对路径来讲,是不受任何影响的
可以选择双写绕过,也可以直接使用..\,因为过滤的是..\”
Payload:
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=..\..\php.ini
双写绕过payload:
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=…/./…/./php.ini
这里大家可以自己看一下../被过滤后的payload,加深对双写绕过的理解
依然可以,没有受到影响
High:
查看源码:
Fnmatch函数:
分析:
限制了page参数的开头必须是file,但是可以用file://协议类进行文件读取
试一试:
http://127.0.0.1/vulnerabilities/fi/?page=D:/phpstudy_pro/WWW/DVWA-master/phpinfo.php
那么就加上file://
Payload:
Impossible:
查看源码:
分析:
使用白名单限制page参数只能是include.php或者file1.php或者file2.php或者file3.php
File Inclusion防护总结:
1.设置白名单(文件名可以确定)
2.过滤危险字符(判断文件名称是否为合法的php文件)
3.设置文件目录(对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录,如open_basedir)
4.关闭危险配置(无需情况下设置allow_url_include和allow_url_fopen为关闭)
5.严格检查include类的文件包含函数中的参数是否外界可控。
来源:freebuf.com 2021-06-25 18:53:50 by: wakemeup
请登录后发表评论
注册