文件包含(漏洞),英文名File Inclusion,意为当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(例如include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。我们的目的,就是获取到网站的路径,从而可以访问文件。
Low
我们调整难度至Low,然后打开File Inclusion关卡:
我们查看源码得知(具体路径见下图),服务器对page参数没有任何的过滤和检查。服务器希望用户点击图中的三个链接,服务器会包含相应文件,并将结果返回。需要说明的是。不管文件后缀是否是php,都会当做php文件执行,如果文件内容确认为php,则正常执行并返回结果,如果不是,则返回打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行:
我们试一下点击当中的File:
事实上恶意的攻击者是不会乖乖点击这些链接的,因此page参数是不可控的。我们用什么方法来进行呢?可以使用url构造路径。
构造绝对路径的url:
我们这里使用Harkbar来构造,这里我们直接通过将include.php改为../../../../../etc/passwd(../实现向上一级目录跳转,多个时就会返回到根目录,其数量应多一点。),然后发现报错了,而且把路径暴露得一清二楚:
通过绝对路径也可以直接访问得到:
http://192.168.1.1/DVWA-master/vulnerabilities/fi/?page=/etc/passwd
通过文件系统访问方式file://也可以实现访问,注意一点的是后面必须是绝对路径:
http://192.168.1.1/DVWA-master/vulnerabilities/fi/?page=file:///etc/passwd
获取到绝对路径之后。我们可以通过进入每一个文件夹得到你要的内容,这里我们在这个路径下访问这个服务器任意一个文件,这里我创建了一个文本文档,里面随便输入了一点内容:
然后访问:
http://192.168.1.1/DVWA-master/vulnerabilities/fi/?page=C:\phpStudy\WWW\111.txt
在超级不显眼的地方,文件里面的东西已经输出出来了,我们访问成功,说明这个路径可用。
Medium
照旧调整为中等难度,然后我们打开代码进行分析(事实上很少,一眼就了解了):
然后看到比起上一个难度,它新增加了两条语句,用str_replace函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 ” ../”、”..\”替换为空字符,即删除。
这样的替换我前面的Sqli-labs里已经提到过,显而易见我们可以通过双写绕过WAF。同时,因为替换的只是“../”、“..\”,所以对采用绝对路径的方式包含文件是不会受到任何限制的,采用绝对路径的办法不受影响。所以我们的语句也与上面基本相同,只是在被替换的地方双写一下即可(红色部分会被替换为空字符,最后前后的http会被保留下来):
http://192.168.1.1/DVWA-master/vulnerabilities/fi/?page=hthttp://tp://192.168.1.1
High
打开DVWA页面,我们调节为High等级,然后打开File Inclusion关卡,发现页面发生了错误:
查看了很多资料,后来女朋友在下列网址发现了解决办法,发现原来是缺少了一部分代码:
https://blog.csdn.net/weixin_44603091/article/details/104373079
我们查看代码来看看这一关进行了什么样的防御:
可以看到,High级别的代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。
因为报错,所以按照错误提示,打开C:\phpStudyB\WWW\vulnerabilities\fi\source\high.php,添加下列语句
if(!function_exists('fnmatch')) {
function fnmatch($pattern, $string) {
return preg_match("#^".strtr(preg_quote($pattern, '#'),array('\*' => '.*', '\?'=> '.'))."$#i", $string);
} // end
} // end if
添加的语句的代码如下图:
然后刷新,发现正常显示:
我们可以利用file协议绕过防护策略。file协议其实我们并不陌生,当我们用浏览器打开一个本地文件时,用的就是file协议。
file协议绕过防护策略
我们来构造一个url的语句,访问我新建的111.txt文件,访问php本地配置文件由于file协议只支持本地文件读取,不支持远程文件执行,就没办法执行远程文件(当然可以利用文件上传漏洞配合执行文件包含) 下次博客会更新文件上传漏洞.结合进去文件包含执行。
http://192.168.1.1/DVWA-master/vulnerabilities/fi/?page=file:///C:\phpStudy\WWW\111.txt
输出成功。