文件包含漏洞

### 一、含义

因为本人也是第一回学的文件包含漏洞,写之前看了其他作者写的文章有的看的不明所以,终于在我翻看了很多文章之后理解了文件包含漏洞,温馨提示:看本文章之前得具备简单的HTML基础以及PHP基础,我们废话不多说直入正题

​ 在理解文件包含之前我们首先得理解文件包含是啥,现在使用PHP脚本语言的网站还是挺多的,文件包含简单来讲就是使1.php中的代码在A页面、B页面、C页面也能得到执行而不是每个页面加入1.php的代码,我们在通过代码来理解文件包含

  • include函数:

    引用其他文件中的代码,并执行。首先我们新建一个menu.php文件内容如下

 <a href="http://www.tutorialspoint.com/index.htm">Home</a> - 
    <a href="http://www.tutorialspoint.com/ebxml">ebXML</a> - 
    <a href="http://www.tutorialspoint.com/ajax">AJAX</a> - 
    <a href="http://www.tutorialspoint.com/perl">PERL</a> <br />

然后我们再建一个test.php内容如下:

<html>
    <body>
    <?php include("menu.php"); ?>
    <p>This is an example to show how to include PHP file!</p>
    </body>
</html>

接着我们访问test.php查看结果

image-20211101181354967

  • require函数

    功能跟include函数一样,不同之处在于require函数在加载文件时出现任何问题都会停止运行而include函数还会继续执行

我们新建一个test1.php文件内容如下(使用include函数)

<html>
    <body>
    <?php include("xxmenu.php"); ?>
    <p>This is an example to show how to include wrong PHP file!</p>
    </body>
</html>

然后访问查看结果

image-20211101182237878

我们看到包含的文件载入出现错误时,后面的段落依然会执行,接下来使用test1的代码建test2.php将include函数换成require函数

<html>
    <body>
    <?php require("xxmenu.php"); ?>
    <p>This is an example to show how to include wrong PHP file!</p>
    </body>
</html>

然后我们访问看结果

image-20211101182719020

这回我们可以看到下面的段落并没有加载出来。

  • include_once(require_once)函数的区别

include_once(require_once)语句在运行脚本期间包含并运行指定文件,这跟上面的include和require函数功能一样不同在于这两个函数会查询一遍已加载列表看文件是否已经加载,如果已经加载那将不会再次加载,如果还没加载那就加载包含的指定文件

<?php
require '1.php';
require '1.php';
?>

这种情况1.php会包含两次

<?php
require '1.php';
require_once '1.php';
?>

这种情况,不会进行第二次包含

以上代码来自于“漏洞银行”本人只是简单解释出来

二、分类

  • 本地包含
  • 远程包含

三、条件

本地包含的条件为:

1-allow_url_fopen=On

2-用户可以动态控制变量

四、怎么利用

我们可以随便在有文件包含漏洞的页面,将他的URL随便写入如下

www.demo.com/分类/数码/耳机/index.php?page=hello.php,然后我们当前的页面就会将hello.php带入到include函数中,因为我们的hello.php是不存在的所以页面就会有如下的类似报错

Quote:


Warning: include(hello.php) [function.include]: failed to open stream: No such file or directory in /vhost/wwwroot/php/index.phpon line 3


Warning: include() [function.include]: Failed opening hello.php for inclusion (include_path=.:) in /vhost/wwwroot/php/index.php on line 3

第一行的警告就是找不到我们指定的hello.php引起的报错

第二行的警告是前面没有找到指定的文件引起的报错

通过这个报错我们可以知道服务器的绝对路径/vhost/wwwroot/php/,之后我们可以通过多次探测得出当前路径下的文件,也可以使用../来进行目录的跳转或者直接指定绝对路径比如: www.xxx.com/index.php?test=/etc/passwd如果目标服务器没有对权限限制的很严格,或者启动Apache的权限比较高是可以读出这个文件的内容,如果我们可以上传文件的话,我们可以上传一句话木马然后再包含一句话木马,再用菜刀连接就会得到服务器的webshell

本地文件包含漏洞利用技巧

  • 包含用户上传的文件 (我们上传的一句话木马等等)
  • 包含data:// 或 php://input 等伪协议
  • 包含 Session 文件
  • 包含日志文件 ( 通过构造语句让服务器报错并将一句话随报错信息写入日志;找到日志文件路径,包含此文件;用菜刀连接;拿下网站的Webshell )
posted @ 2021-11-01 20:07  crany  阅读(140)  评论(0)    收藏  举报