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列目录的研究。
对传入的参数进行校检和过滤始终是有必要的。