正如我一如既往的习惯,进行漏洞测试前先研究下漏洞产生原理。
今天我们从理论上研究下文件包含漏洞,大多数web语言都可以使用文件包含操作,其中php提供文件包含操作太强大,太灵活,所以文件包含通常出现在php语言中。这是一个错误的认知,在其它语言中也可能出现文件包含漏洞。
今天我们就php语言为例讲一下。
Php包含
Php提供了四个文件包含的函数,分别是include(),include_once( ),require( )和require_once( )。
Php文件包含分为两种,一种是本地文件包含,一种是远程文件包含。
在以下代码测试中服务器环境为
Php 5.2.14
MySQL 5.1
Apache 2.0.63
1.本地文件包含 Local File Include(LFI)
ArrayUtil.php文件提供了字符串操作函数,代码如下:
<?php
function PrintArr ( $arr, $sp=”-->”,$lin=”<br />”){
foreach( )($arr as $key => $value){
echo “$key $sp $value $lin”;
}
}
...
...
?>
Index.php对ArrayUtil.php进行包含,并且使用PrintArr函数,代码如下
include(“ArrayUtil.php”); //对ArrayUtil.php进行包含
$arr = array(“张三”,“李四”,“王五”);
PrintArr($arr,”==>”);//使用PrintArr函数
index.php执行后结果如图:
接下来看另一个例子,phpinto.txt是一个正常的文本文件,但内容却是符合php语法的
<?php
phpinto();
?>
在Index.php中包含phpinto.txt,代码如下:
<? php
include(“phpinto.txt”);
?>
访问index.php,执行结果如图:
接下来将phpinto.txt的后缀改成“jpg”,“rar”,”doc”等都可以正常执行,这证明了无论文件的后缀是什么,只要内容符合php语法,任何扩展名都可以被php解析。
如果不符合php语法会发生什么呢?比如是数据库的配置文件db.Properies。
db.dbName=Myschool
db.username=root
db.password=root
db.port=3306
在index.php中包含db.Properies,代码如下:
<?php
Include(“db.Properies”);
?>
执行结果如图:
由此可知,如果不符合php语法则会暴露其源码。
2.远程文件包含 Remote File include (RFI)
如果要使用远程包含功能,首先要确定php远程包含功能选项是否开启(默认关闭),开启需要在php的配置文件里php.ini配置文件中修改,修改后需要重启web容器服务使其生效,选项如下:
allow_url_include=off //把off改为on
下面是远程php文件包含例子:
http://www.2cto.com/根目录下包含php.txt文件,源码如下:
<?php
echo “Hello World”;
?>
Index.php的源码如下:
<?php
Include($_GET[‘page’]);
?>
访问
(http://www.xxxser.com/index.php?page=http://www.2cto.com/php.txt)
执行结果如图:
远程包含和本地包含没有区别,只要符合php语法就可以被解析。
基本知识暂时只叙述这些,至于漏洞利用会结合漏洞测试进行讨论,总之文件包含漏洞危害巨大,在某些情况下,我们甚至能够获取管理员的密码信息。