文件包含漏洞浅析

正如我一如既往的习惯,进行漏洞测试前先研究下漏洞产生原理。
今天我们从理论上研究下文件包含漏洞,大多数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文件提供了字符串操作函数,代码如下:

function PrintArr ( $arr, $sp=”-->”,$lin=”
”){ 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,执行结果如图:

文件包含漏洞浅析_第1张图片

接下来将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文件,源码如下:


echo “Hello World”;
?>

Index.php的源码如下:


Include($_GET[‘page’]);
?>

访问
(http://www.xxxser.com/index.php?page=http://www.2cto.com/php.txt)

执行结果如图:

这里写图片描述
远程包含和本地包含没有区别,只要符合php语法就可以被解析。
基本知识暂时只叙述这些,至于漏洞利用会结合漏洞测试进行讨论,总之文件包含漏洞危害巨大,在某些情况下,我们甚至能够获取管理员的密码信息。

你可能感兴趣的:(漏洞挖掘)