其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。文件包含漏洞可能出如今JSP、PHP、 ASP等语言中,原理都是同样的,本文只介绍PHP文件包含漏洞。php
要想成功利用文件包含漏洞进行攻击,须要知足如下两个条件:html
1. Web应用采用include()等文件包含函数经过动态变量的方式引入须要包含的文件 (文件包含函数还有 include_once()、require()、require_once())安全
2. 用户可以控制该动态变量服务器
如今来看一段简单的文件包含代码:函数
<?php $filename = $_GET['filename']; include($filename);
经过上面的代码能够看到,在获得变量$filename的值后没有通过任何处理,直接带入include()函数中。此处就存在一个文件包含漏洞,利用该漏洞咱们能够查看系统中的任意文件。测试
下面咱们来实际测试一下。首先将该PHP页面上传到Web服务器,先让其包含一个正常的txt文件,运行结果以下图2所示。网站
图2ui
接着咱们在该txt文本中插入php代码,看结果如何?这里给其插入以下图3所示代码。url
图3设计
再次访问,结果以下图4所示。
图4
经过上图咱们能够看到文本中的PHP代码被成功执行了。
利用该漏洞,咱们能够查看系统中的任意文件,好比常常用到的“/etc/passwd”文件,如图5所示。
图5
PHP文件包含漏洞分为
1、本地文件包含漏洞(LFI):可以打开并包含本地文件的漏洞,被称为本地文件包含漏洞。利用本地文件包含漏洞,能够查看系统任意文件内容,若是具有一些条件,也能够执行命令。在下面的漏洞利用技巧部分对这个有详细介绍。
2、远程文件包含漏洞(RFI):如 果php.ini的配置选项allow_url_fopen和allow_url_include为ON的话,则文件包含函数是能够加载远程文件的,这种 漏洞被称为远程文件包含漏洞。利用远程文件包含漏洞,能够直接执行任意命令。在实际渗透攻击过程当中,攻击者能够在本身的Web服务器上放一个可执行的恶意 文件,经过目标网站存在的远程文件包含漏洞来加载文件,从而实现执行任意命令的目的。
文件包含漏洞利用技巧
远程文件包含漏洞之因此可以执行命令,就是由于攻击者能够自定义被包含的文件内容。所以,本地文件包含漏洞要想执行命令,也须要找一个攻击者可以控制内容的本地文件。
目前主要有几下几种常见的技巧:
包含用户上传的文件。这个很好理解,也是最简单的一种办法。若是用户上传的文件内容中包含PHP代码,那么这些代码被文件包含函数加载后将会被执行。但可否攻击成功,取决于上传功能的设计,好比须要知道上传文件存放的物理路径,还须要上传的文件有执行权限。
包含data://或php://input等伪协议。这须要目标服务器支持,同时要求allow_url_fopen为设置为ON。在PHP5.2.0以后的版本中支持data:伪协议,能够很方便地执行代码。
包含Session文件。这部分须要攻击者可以控制部分Session文件的内容,PHP默认生成的Session文件通常存放在/tmp目录下。
包 含日志文件。好比Web服务器的访问日志文件,这是一种通用的技巧。由于几乎全部网站都会将用户的访问记录到访问日志中。所以,攻击者能够向Web日志中 插入PHP代码,经过文件包含漏洞来执行包含在Web日志中的PHP代码,下面的案例中就是利用该技巧成功获取到目标网站的WebShell的。但须要注 意的是,若是网站访问量大的话,日志文件可能会很是大,这时若是包含一个这么大的文件时,PHP进程可能会卡死。通常网站一般会天天生成一个新的日志文 件,所以在凌晨时进行攻击相对来讲容易成功。
包含/proc/self/environ文件。这个也是一种通用的技巧,由于它根本不须要猜想被包含文件的路径,同时用户也能控制它的内容,常见的作法是向User-Agent中注入PHP代码来完成攻击。
PHP文件包含漏洞防范
本部分主要从代码层和Web服务器安全配置两个方面来说解PHP文件包含 漏洞的防范。首先来从代码层来说,在开发过程当中应该尽可能避免动态的变量,尤为是用户能够控制的变量。一种保险的作法是采用“白名单”的方式将容许包含的文 件列出来,只容许包含白名单中的文件,这样就能够避免任意文件包含的风险,可参考下面图10所示的代码实现。
图10
还有一种作法是将文件包含漏洞利用过程当中的一些特殊字符定义在黑名单中,对传入的参数进行过滤,但这样有时会由于过滤不全,致使被有经验的攻击者绕过。
在 Web服务器安全配置方面能够经过设定php.ini中open_basedir的值将容许包含的文件限定在某一特定目录内,这样能够有效避免利用文件包 含漏洞进行的攻击。须要注意的是,open_basedir的值是目录的前缀,所以假设设置以下值:open_basedir=/var/www /test,那么实际上如下目录都是在容许范围内的。
/var/www/test
/var/www/test123
/var/www/testabc
若是要限定一个指定的目录,须要在最后加上“/”,这一点须要特别注意。
open_basedir=/var/www/test/
若是有多个目录,在Windows下目录间用分号隔开,在Linux下面则用冒号隔开。
综合来讲,文件包含漏洞的防范方案有:
1. 在代码层面
文件包含函数的文件名尽可能避免动态变量,尤为是用户能够控制的变量;最好使用文件名白名单
2. 服务器配置方面
a. php.ini中open_basedir的值将容许包含的文件限定在某一特定目录内,这样能够有效避免利用文件包 含漏洞进行的攻击 {本地文件包含漏洞}
b. php.ini的配置选项allow_url_fopen和allow_url_include设置为Off (禁止打开远程文件,禁止包含远程文件) {远程文件包含漏洞}
文章转自:http://www.rising.com.cn/newsletter/news/2013-04-25/13587.html