简单一句话,为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。
漏洞成因
在包含文件时候,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值可控而服务器端未对变量值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞。通常文件包含漏洞出现在PHP语言中。
PHP产生文件包含的函数
include( ):当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含
进来,发生错误时之给出一个警告,继续向下执行。
include_once( ):功能与 Include()相同,区别在于当重复调用同一文件时,程序只调用一次
require( )
require()与 include()的区别在于 require()执行如果发生错误,函数会输出
错误信息,并终止脚本的运行。
require_once( )
功能与 require()相同,区别在于当重复调用同一文件时,程序只调用一次。
远程文件包含
当包含的文件在远程服务器上时,就形成了远程文件包含。
存在条件
需要php.ini中allow_url_include = on以及allow_url_fopen=on
所包含远程服务器的文件后缀不能与目标服务器语言相同。(比如目标服务器是php脚本语言解析的,那么包含的远程服务器文件后缀不能是php)
本地文件包含
当包含的文件在服务器本地时,就形成了本地文件包含。
开发者为了预防本地文件包含,通常采用限制文件后缀名的方式。此时,可以使用%00截断,不过需要有前提条件:
1). PHP版本 < 5.3 (不包括5.3) ;
2). PHPmagic_quotes_gpc = off;
3).PHP对所接收的参数,如以上代码的$_GET[‘file’]未使用addslashes函数。
防范措施
1.过滤各种././,http://,https://
2.配置php.ini配置文件:
allow_url_fopen=off
Allow_url_include= off
magic_quotes_gpc=on
3.通过白名单策略,仅允许包含运行指定的文件,其他的都禁止;