1、定义
文件包含漏洞是指客户端(一般为浏览器)用户通过输入控制动态包含在服务器的文件,从而导致恶意代码的执行及敏感信息泄露,主要包括本地文件包含LFI和远程文件包含RFI两种形式。
2、原理
由于开发人员编写源码时将可重复使用的代码写入到单个的文件中并在需要的时候将它们包含在特殊的功能代码文件中,这样被包含文件中的代码就会被解释执行。如果没有针对代码中存在文件包含的函数入口做过滤,就会导致客户端可以提交恶意构造语句提交,并交由服务器端解释执行。文件包含攻击可能存在于WEB服务器源码里的inlcude()此类文件包含操作函数附近,通过客户端构造提交文件路径,是该漏洞攻击成功的最主要原因。
3、常见函数
php:include(),include_once(), require(),require_once(), fopen(),readfile()
Jsp/servlet: java.io.File(), java.io.FileReader()
asp: include file, include virtual
4、本地包含:
v WINDOWS下的路径截断:
1).第一种路径截断
在Windows系统下,某些PHP版本的文件系统模块对于文件名后面所跟的“ \.” 或者“./” 或者“ \” 或者“/” 或者“.” 都会自动过滤而正常读写文件。据此可构造恶意的文件路径,又因为Windows下文件路径最大长度为260,因此只需构造如下字符串即可路径截断:
Filename///...(252个/)…/.php
Filename\\\...(252个\)…\.php
Filename./././...(126个./)…./.php
Filename\.\.\...(126个\)…\..php
2).第二种路径截断
在Windows系统下, PHP 5.3.4以下版本(不包含5.3.4)的文件系统模块对于文件路径是以路径中的字节为0x00为字符串结束标志。又因为0x00的URL编码为%00,因此这种截断便称为%00截断或00截断(00截断的产生与PHP版本以及PHP运行平台有关,经测试该漏洞只能应用于Windows平台下)。 据此可构造恶意的文件路径:
Filename%00.php
限制条件
1).php版本: (已测可行版本:PHP 5.3.4以下版本(不包含5.3.4));
2).平台限制:只能运行在Windows下;
3).magic_quote_gpc为Off;
v LINUX下的路径截断
在Linux系统下,某些PHP版本的文件系统模块对于文件名后面所跟的“/.” 或者“/” 都会自动过滤而正常读写文件。据此可构造恶意的文件路径,又因为Linux下文件路径最大长度为4098,因此只需构造如下字符串即可路径截断:
Filename///...(4090个/)…/.php
Filename/././....(2045个/.)…/..php
v 本地包含攻击方法
1、针对上传文件的攻击方法
通过目标网站的上传点上传网站允许范围内的文件,比如上传后缀为.jpg,.gif,.rar,.pdf等等。然后在有LFI漏洞的注入点中写入上传的文件的路径及文件名,而后结合php的路径截断特性来进行文件包含漏洞利用。
2、针对WEB服务器日志的攻击方法
Apache的日志默认存储在安装目录下的logs文件夹下,主要有访问日志和错误日志。在Windows下这两个日志文件为access.log和error.log, Linux下是access_log和error_log。
绕过URL编码
利用 HTTPHEADER中Authorization字段,该字段是用来发送用于HTTPAUTH认证的信息,其值的格式为”Basic base64(User:Pass)”。
3、针对/proc/self/environ的攻击方法
/proc/self/environ是Linux系统下的环境变量文件,用于保存系统的一些变量。访问者可通过修改浏览器的User Agent信息插入自己的内容到该文件,利用这一特性将php代码写入/proc/self/environ文件中,然后在有LFI漏洞的注入点中写入该文件的正确路径及文件名,而后结合php的路径截断特性来进行文件包含漏洞利用。
4、针对session文件的攻击方法
php session文件是php的session会话机制产生的文件,一般用于用户身份认证,会话状态管理等等。该文件一般存储在/tmp/(Linux) ,/var/lib/php/sessison/(Linux), c: \windows\temp\(Windows) 等目录下。当知道session存储路径时,我们可通过firefox的firebug插件查看当前SESSIONID( session文件名格式为:sess_SESSIONID), 然后在有LFI漏洞的注入点中写入session文件的路径及文件名,而后结合php的路径截断特性来进行文件包含漏洞利用。
5、PHP Wrapper之LFI攻击方法
php wrapper是php内置URL风格( http://) 的封装协议,可用于类似fopen() 、 copy() 、 file_exists() 和filesize()的文件系统函数。可用于本地文件包含LFI漏洞的伪协议主要有:file://(访问本地文件系统) 、php://filter(对本地文件系统进行读写) ;
例如:php://filter/read=convert.base64-encode/resource=./key.php
6、其他攻击方法
A).包含上传的临时文件;
B).包含由 php程序生成的文件,缓存、模版等;