目录
本地文件包含(LFI,Local File Include)
远程文件包含(RFI,Remote File Include)
一、产生的原因
程序开发人员为了使代码更为灵活,通常将可以重复使用的代码写到一个文件中,然后在使用某些函数时,直接调用该文件,该过程称为文件包含。由于这种灵活性,导致客户端可以调用恶意文件,直接执行恶意操作,从而造成文件包含漏洞。文件包含漏洞以PHP最为突出。
二、文件包含函数
include()、include_once()、require()、require_once()
三、文件包含漏洞的条件
●include()等函数通过动态变量的方式包含需要包含的文件
●攻击者能够控制该动态变量
四、本地文件包含和远程文件包含
本地文件包含(LFI,Local File Include)
本地文件包含是加载服务器本地的文件。
如果在目标系统存在一个包含PHP代码的文件(即使是文本文件),则通过本地文件包含可以执行该PHP代码。
远程文件包含(RFI,Remote File Include)
远程文件包含是通过HTTP等协议加载一个远程文件资源。
在PHP中,远程文件包含默认是关闭的。要开启此功能,需要在php.ini文件中对配置进行修改,将allow_url_include选项设置为on,重启服务器即生效。
攻击者可以将shell.txt文件放置在远程服务器192.168.1.1上,并通过输入“http://192.168.1.1/shell.txt”的方式将其包含执行。
五、文件包含的危害
●读取敏感文件。比如PHP的配置文件php.ini、Apache的配置文件httpd.conf都是攻击者感兴趣的敏感文件。
●远程包含shell。
●基于PHP封装协议读取源码文件。PHP带有很多内置URL风格的封装协议,如 file://、http://、ftp://、php://、zlib://、data://等。因为直接包含PHP文件,会被解析执行,无法查看PHP源码。因此要想读取PHP文件源码,需要使用PHP的过滤器封装协议。比如要读取login.php文件,直接输入URL参数为"?file=login.php",页面会显示login.php解析执行后的页面。要想看到login.php的源码,可输入参数"?file=php://filter/read=convert.base-64-encode/resource=login.php",此时将得到页面的base64编码后的字符串,将其解码就得到了login.php的源码。
六、文件包含的防御
●严格判断包含中的参数是否外部可控。
●对包含路径进行限制。限制被包含的文件只能在某个文件夹内,禁用目录跳转字符(如:../)。本地文件包含可以通过PHP中配置open_basedir选项来限制特定的可打开文件目录。
●文件验证。验证包含的文件是否是在白名单中。
●尽量减少或不使用动态包含,必须使用文件包含的地方直接静态写入,不允许通过动态变量的方式控制包含文件,如:include(“footer.php”)。