文件包含漏洞
*文件包含*
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,而在JSP、ASP、ASP.NET程序中却非常少,甚至没有,这是有些语言设计的弊端。在PHP中经常出现包含漏洞,但这并不意味这其他语言不存在。
*背景介绍*
随着网站业务需求,web脚本可能允许客户端用户输入控制动态包含在服务端的文件,会导致恶意代码的执行及敏感信息泄露,主要包括本地文件上传和远程文件包含的两种形式
*漏洞成因*
文 件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就 可能导致意外的文件泄露甚至恶意的代码注入。当被包含的文件在服务器本地时,就形成的本地文件包含漏洞,被包涵的文件在第三方服务是,就形成了远程文件包 含漏洞。
*常见漏洞代码*
if (isset($_GET[page])) {
include $_GET[page];
} else {
include "home.PHP";
}
*触漏洞条件*
web应用采用include()等文件包含函数通过动态变量的方式引入需要包含的文件
用户能够控制该动态变量
*常用文件包含函数*
*漏洞危害*
执行任意代码
包含恶意文件控制网站
甚至控制服务器
*漏洞分类*
*可读如下敏感文件*
*读php文件*
*包含日志*(需要知道日志的路径)
日志会记录客户端请求及服务器响应的信息,访问http://www.xx.com/<?php phpinfo(); ?>
时,<?php phpinfo(); ?>也会被记录在日志里,也可以插入到User-Agent
搭建环境,如图所示,包含phpinfo();
*包含环境变量文件*
远程包含
远程的文件名不能为php可解析的扩展名,allow_url_fopen和allow_url_include为On是必须的
*php防御*