漏洞简介
文件包含漏洞(File Inclusion)是一种常见的依赖于脚本运行从而影响Web运用的漏洞。严格来说,文件包含漏洞是"代码注入"的一种,许多脚本措辞,例如PHP、JSP、ASP、.NET等,都供应了一种包含文件的功能,这种功能许可开拓者将可利用的脚本代码插入到单个文件中保存,在须要调用的时候可以直接通过载入文件的办法实行里面的代码,但是如果攻击者掌握了可实行代码的路径,也便是文件位置时,攻击者可以修正指定路径,将其指向一个包含了恶意代码的恶意文件。
文件包含漏洞常日都会使Web做事器的文件被外界浏览导入信息透露,实行的恶意脚本会导致网站被修改,实行造孽操作,攻击其他网站,获取WebShell等严重危害。
漏洞产生事理
在上一节的描述中我们提到,攻击者通过掌握可实行代码的路径就可以实现文件包含漏洞,这只是一个对整体攻击流程的简化描述,在实际情境下,做事器解析实行php文件时通过包含函数可以加载另一个文件中的php代码,当被包含的文件中存在木马时,就意味着木马程序会在做事器上加载实行。

以是产生文件包含漏洞的根本缘故原由在于开拓者是否对通过包含函数加载的文件进行了严格且合理的校验,在PHP中统共有四种文件包含函数:
1)Include():包含并运行指定的文件,只有在程序实行到include时才包含文件,且当包含文件发生缺点时,程序警告,但会连续实行。
2)Require():只要程序一运行就会实行该包含文件函数,当包含文件发生缺点时,程序直接终止实行。3)Include_once():和include()类似,不同之处在于include_once会检讨这个文件是否已经被导入,如果已导入、下文便不会再导入。4)Require_once():和require()类似,不同处在于require_once也是与include_once一样只导入一次。
根据被包含文件的位置不同,PHP文件包含漏洞可以分为本地文件包含漏洞(Local File Inclusion,LFI),和远程文件包含漏洞(Remote File Inclusion,RFI)。顾名思义,所谓确当地文件包含漏洞指的是攻击者通过掌握包含文件函数,如include(),require()等,加载做事器本地上的PHP脚本文件,当然如果本地的PHP脚本文件都是一些对系统无害的功能性文件,攻击者也无法进行进一步的利用,但若是攻击者能够合营任意文件上传漏洞,将恶意文件上传进做事器中,再通过本地文件包含实行该恶意脚本就可以达到得到网站掌握权的目的。
而远程文件包含漏洞是指攻击者可以通过文件包含函数加载其他做事器上的PHP文件,在实际项渗透目中,攻击者可以在自己的做事器上存放一个可实行的恶意文件,然后通过目标网站存在远程文件包含漏洞来加载干系文件,实现任意命令实行。
漏洞复现
01 PHP本地文件包含漏洞获取做事器敏感信息
搭建测试环境,为了方便演示,我们大略设计了一个做事器上的PHP脚本代码,如下:
个中PHP配置文件中,allow_url_fopen和allow_url_include两个参数默认是ON的状态。(在本地文件包含漏洞中,allow_url_fopen必须是ON的状态allow_url_include的状态可以不用必须指定。)
通过访问该资源,可以判断利用了文件包含函数。
做事器直接将file参数当作文件包含的参数路径,并未做任何过滤,攻击者可以直接在file参数后面填写做事器敏感文件路径,从而得到做事器敏感信息,例如在file后加上../../MYSQL/my.ini即可读取到做事器本地的Mysql配置文件。
02 PHP远程文件包含漏洞得到网站WebShell
同样还是采取相同的做事器代码,个中PHP配置文件中,allow_url_fopen和allow_url_include两个参数都必须是ON的状态。
目标做事器地址:192.168.20.35
攻击者远程做事器:192.168.210.102
在攻击者个人做事器上,放置了一个恶意文件(index.txt),如下:
该文件可以向目标做事器上创建一个hack.php脚本文件,并向个中写入一句话木马(已被Base64加密),这里要把稳的是恶意文件不能是php可解析的扩展名,也便是不能以php结尾。
攻击者通过远程文件包含漏洞,触发该文件(在file参数处写入http://192.168.210.35/index.txt即可),如下:
然落后击者就可以通过连接工具,远程连接木马并得到网站WebShell。
防御方案
01设置白名单
代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。
02过滤危险字符
由于Include/Require可以对PHP Wrapper形式的地址进行包含实行(须要配置php.ini),在Linux环境中可以通过"../../"的形式进行目录绕过,以是须要判断文件名称是否为合法的PHP文件。
03设置文件目录
PHP配置文件中有open_basedir选项可以设置用户须要实行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件。
04关闭危险配置
PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信赖性及不愿定性,在开拓中禁止打开此选项,PHP默认是关闭的。
05提升安全开拓意识
任意文件包含漏洞的紧张涌如今能够解析处理脚本文件的函数上,没有对输入的变量进行过滤,导致任意文件包含,进而导致恶意代码实行。在开拓处理这类功能函数上,一定要遵照编程规范;在代码核心处,对变量进行过滤限定,设置文件路径或者白名单,避免实行任意文件包含。
本文转自杭州美创科技有限公司"大众号(第59号),如需二次转载,请咨询marketing@mchz.com.cn。