文件包含漏洞浅析

来源:互联网 发布:ci 源码质量 thinkphp 编辑:程序博客网 时间:2024/04/29 02:01
正如我一如既往的习惯,进行漏洞测试前先研究下漏洞产生原理。今天我们从理论上研究下文件包含漏洞,大多数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,代码如下:

 <? phpinclude(“phpinto.txt”);?>

访问index.php,执行结果如图:

这里写图片描述

接下来将phpinto.txt的后缀改成“jpg”,“rar”,”doc”等都可以正常执行,这证明了无论文件的后缀是什么,只要内容符合php语法,任何扩展名都可以被php解析。

如果不符合php语法会发生什么呢?比如是数据库的配置文件db.Properies。

db.dbName=Myschooldb.username=rootdb.password=rootdb.port=3306

在index.php中包含db.Properies,代码如下:

<?phpInclude(“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文件,源码如下:

<?phpecho “Hello World”;?>

Index.php的源码如下:

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

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

执行结果如图:

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

原创粉丝点击