php文件包含漏洞——LFI与RFI

文件包含(File Include)是php脚本的一大特色,程序员们为了开发的方便,常常会用到包含。比如把一系列功能函数都写进fuction.php中,之后当某个文件需要调用的时候就直接在文件头中写上一句 include "fuction.php"就可以调用内部定义的函数。而根据利用形式的不同,分为本地文件包含(LFI)和远程文件包含(RFI)。LFI只能包含服务器本地磁盘中的文件(权限允许的情况下),而RFI则可以包含服务器以外的远端文件(一般通过URL进行访问)。

先了解什么叫做文件包含。

1

有一个文件test.php,里面内容如下:

<?php
    include "1.txt";
?>

然后同一级目录下有1.txt,内容是“测试文件包含”。

访问test.php结果:

2

把test.php的代码修改一下:

<?php
    include "1.txt";
    include "1.txt";
?>

3

包含了两次就打印两次1.txt的内容。

文件包含一般会用到4个php函数,分别是include、include_once、require和require_once。解释一下这4个函数的区别。

include和require除了在如何处理包含失败之外完全一样。

include是包含,如果程序执行到这行没有找到文件会提示警告,但后续代码继续执行。

require是引用资源,如果资源文件没有找到,程序会产生致命错误并且终止剩余代码执行。

*_once函数和对应不加once的函数结果是一样的,只是如果包含的文件已经存在就不再包含。

把test.php的代码改成如下形式:

<?php
    include "2.txt";
    include "1.txt";
?>

当前目录下只有1.txt,并不存在2.txt。返回的结果是:

4

2.txt不存在所以报错了,但同时成功把1.txt包含了。把include换成require试试:

<?php
    require "2.txt";
    require "1.txt";
?>

5

只执行了第一行代码,由于2.txt不存在,所以后面的代码都不执行了。


那这个文件包含功能可以如何利用呢?

<?php
    $f = $_GET["file"]; 
    include $f.".php";
?>

对于上面的代码,在正常使用过程中应该是这样的:http://localhost/test.php?file=1

6

这样了就包含了1.php这个文件。

由于test.php没有对参数file进行过滤,导致了包含漏洞的出现。假设我们知道当前目录下有一个查看php状态的phpinfo.txt文件(内容是phpinfo();),因为是文本文档所以直接访问并不能执行里面的语句,但能被包含的话则会以php执行。(写到这里很悲催的发现虚拟机的php版本太新了已经不能截断了,赶紧换一个去。。。)

« 返回