文件包含漏洞
文件包含
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为包含。
程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量,来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞。
几乎所有的脚本语言都会提供文件包含功能。文件包含漏洞在PHP Web Application中居多,在JSP/ASP/ASP.net程序中比较少。接下来以PHP为例,说明文件包含漏洞。
漏洞产生的原因
1、web应用实现了动态包含
2、动态包含的文件路径参数,客户端可控
PHP中的文件包含
*语句
PHP中提供了四个文件包含的函数,四个函数之间略有区别。如下函数区别
include()
文件包含失败时,会产生警告,脚本会继续运行。
include_once()
与include()功能相同,文件只会被包含一次。
require()
文件包含失败时,会产生错误,直接结束脚本执行。
require_once()
与require()功能相同,文件只会被包含一次。
*相关配置
文件包含是PHP的基本功能之一,有本地文件包含和远程文件包含之分(虽然php官网上不是这么解释的)。简单来说,本地文件包含就是可以读取和打开本地文件,远程文件包含
(HTTT, FTP, PHP伪协议)就是可以远程加载文件。我们可以通过php. ini来进行配置。如下
allow_ url_ fopen=0n/0ff
本地文件包含(LFI)
allow_ url_ include=0n/0ff
远程文件包含(RFI)
文件包含示例
我们可以通过以下简单的代码来测试文件包含漏洞。准备一个include. php文件。
<?php
echo "<h1>This is include_once.php!</h1>";
include_once("./info.php");
?>
或者
<?php
$path=$_GET['path'];
include_once("./info.php");
echo "<h1>This is include_once.php!</h1>";
?>
该文件会从GET方法中获取path变量,也就是文件包含路径,然后包含此文件。创建一个文件info.php,
这个包含的文件的内容为phpinfo()。
<?php
phpinfo(