本地文件包含(Local File Include)

1、漏洞简介


如果允许客户端用户输入控制动态包含在服务器端的文件,会导致恶意代码的执行及敏感信息泄露,主要包括本地文件包含和远程文件包含两种形式。

2、漏洞成因


文件包含漏洞的产生原因是在通过引入文件时,由于传入的文件名没有经过合理的校验,或者校检被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。

3、漏洞的检测及利用


许多工具都支持本地文件包含漏洞的检测,Kadimus是其中一款。具体使用方法参见Kadimus

以下是一些本地包含漏洞中常利用的服务器上的重要文件

.htaccess
/var/lib/locate.db
/var/lib/mlocate/mlocate.db 
/var/log/apache/error.log
/usr/local/apache2/conf/httpd.conf
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.keystore
/root/.ssh/id_rsa.pub
/root/.ssh/known_hosts
/etc/shadow
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]* (文件标识符)
/proc/mounts
/proc/config.gz

本地文件包含漏洞也常需要进行截断,以下是一些常用的截断方法

%00截断:
/etc/passwd%00
(需要 magic_quotes_gpc=off,PHP小于5.3.4有效)
%00截断目录遍历:
/var/www/%00
(需要 magic_quotes_gpc=off,unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris)
路径长度截断:
/etc/passwd/././././././.[…]/./././././.
(php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256)
点号截断:
/boot.ini/………[…]…………
(php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256)

4、漏洞修复


php中可以使用

open_basedir

将用户文件访问限制在指定的区域。如将文件访问限制在

/dir/user/

中。

在php.ini中设置

open_basedir = /dir/user/

但该方法并不是万能的,在某些情况下仍可能会被绕过,参见PHP绕过open_basedir列目录的研究

对传入的参数进行校检和过滤始终是有必要的。

5、实际案例

6、相关资源