DVWA靶场实战(四)——File Inclusion
DVWA靶场实战(四)
四、File Inclusion:
1.漏洞原理:
随着网站的业务的需求,程序开发人员一般希望代码更加灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校检或者校检被绕过就造成了文件包含漏洞。
2. 常见函数:
(1) include()当前使用该函数包含文件时,只有代码执行到include()将文件包含起来,发生错误时给出一个警告,然后将继续执行语句。
(2) include_once()功能和include()相同,区别当重复调用一个文件时,程序只调用一次。
(3) require()执行如果发生错误,函数会发出错误信息,并终止脚本运行。
(4) require_once和require()相同区别在于当重复调用一个文件时,程序只调用一次。
(5) nighcight_file(),show_source()函数对文件进行语法高亮显示,通常可以看见源代码。
(6) readfile(),file_get_contents()函数读取一个文件,并写入缓冲。
(7) fopen(),打开一个文件或url
注:几乎所有的脚本语言中都提供文件包含的功能,但是文件包含漏洞在PHP中居多,而在jsp/ASP/ASP.NETC程序中非常少,甚至没有文件包含漏洞的存在。
3. 漏洞分类:
(1)本地文件包含漏洞:
当被包含的文件就在服务器本地时,就形成了本地文件包含漏洞。一般会有以下的代码环境:
<?php
$file=$_GET[“file”];
Include($flir);
?>
(2)远程文件包含漏洞:
本地文件包含和远程文件包含造成漏洞的原因是一样的,当php.ini中的配置选项allow_url_fope和alliw_url_include为ON的话,则包含的文件可以是第三方服务器中的文件,就形成了远程文件包含漏洞。
4. 防御手段:
(1)文件名验证防护:包含文件验证是指对可保护文件名设置黑名单或白名单、文件后缀名固定等。如果需要使用文件包含,则通过使用白名单的方法对要包含的文件进行限制,这样可以做到既使用了文件包含,又可以防止问价包含漏洞。
(2)文件名验证绕过防护:这种防护手段主要有两种方式,第一种方式就是在文件后缀名处下手,另一个方式是通过目录长度限制来截断。严格限制包含中的参数,取消那些不可控的参数。
(3)中间件安全配置防护:合理地配置中间件的安全选项也会有良好的防护效果,这主要是通过调整中间件及PHP的安全配置,使得用户在调整文件时进行基本的过滤及限制。
(4)禁用相应函数防护:如果不需要文件包含,则关闭相应的文件包含的函数,这防止远程文件包含,这是最安全的办法。
(5)关闭威胁配置防护:可以将PHP中的一些危险配置直接关闭,由于远程文件的不可信任性及不确定性,在开发中直接禁用远程文件文件包含选项。
5. 漏洞危害:
(1)web服务器的文件被外界浏览导致信息泄露。
(2)脚本被任意执行,典型影响如下:
① 篡改网站;
② 执行非法操作;
③ 攻击其他网站;
6. 注意事项:
在攻击靶场过程中可能会遇到File Inclusion这样的报错。“The PHP function allow_url_include is not enabled.”
遇到以上情况,我们找到我们安装phpstudy_pro目录的“Extensions”文件夹,找到“php”文件夹,然后找到名称为“php.ini”的文件,找到“allow_url_include=Off”选项,然后将其改为“allow_url_include=On”保存,然后重新启动小皮面板就ok了。
7. 实战:
(1) Low
代码分析:
这里我们可以看出该文件没有进行任何的过滤,这导致我们可以包含任何的文件。当上传问及那不存在时,可以看到,发生了报错,并且把网站的路径都给暴露出来了。所以第一行的意思就是,找不到我们指定名称文件,所以WARNING。而第二行的警告是因为前面没有找到指定文件,所以包含的时候就出警告了。但同时暴露了服务器文件的绝对路径“D:\phpstudy_pro\WWW\DVWA\vulnerabilities\fi\index.php”
所以我们就可以开始构造url,此时我们产生本地包含使用“192.168.1.22:81/dvwa/vulnerabilities/fi/?page=../../phpinfo.php”就可以访问phpinfo.php界面。也可以尝试本地包含百度,可以发现也是成功的。
(2)Medium:
代码分析:
这里“$file=str_replace(array(“http://”,”https://”),””,$file);”的意思就是将“http://”、“https://”、“../”、“..\”全部替换为了空(就是删了),所以这里我们采用双写过滤的方式绕过。
我们这里采用“....//....//phpinfo.php”的payload进行攻击,在替换后就相当于“../../phpinfo.php”说明此方法可行,所以如果我们要利用文件包含漏洞访问“hhtp://www.baidu.com”就只用写为“hthttp://tp://www.baidu.com”就可以绕过。
(3)High:
代码分析:
这里我们看出来他使用了fnmatch函数,该函数的功能是指定的模式来匹配文件名或字符串。
我们可以看见这里运用了fnmatch函数检查page参数,要求参数开头必须是file,服务器才回去包含相应文件。所以这里只能用伪协议包含,伪协议也就是“file://”来访问本地文件系统,关于“伪协议包含”补充以下:
伪协议 |
作用 |
file:// |
访问本地文件系统 |
http:// |
访问HTTP网址 |
https:// |
访问HTTPS网址 |
ftp:// |
访问FTP URL |
php:// |
访问输入输出流 |
zlib:// |
压缩流 |
data:// |
数据 |
ssh2:// |
security shell2 |
expect:// |
处理交互式的流 |
glob:// |
查找匹配的文件路径 |
注:伪协议后文件必须是绝对路径。
了解完这些后我们开始进行攻击,这里我们将url进行构造选择将之前在low中我们获取的绝对路径加上“file:///”变成“file:///[绝对路径]”的格式,“http://192.168.1.22:81/dvwa/vulnerabilities/fi/?page=file:///D:\phpstudy_pro\WWW\DVWA\phpinfo.php”然后构造以上payload进行攻击,得到phpinfo。
(4)Impossible:
代码分析:
这里使用白名单进行保护,所以已经没有了文件包含漏洞。