文件包含漏洞简介

漏洞原理   

         程序开发人员通常会把可重复使用的函数写到单个文件中,在使用其它函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般称为包含。程序开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用。正是这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

漏洞场景

       php中引发文件包含漏洞的通常是以下四个函数:

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

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

3. require() 只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行

4. require_once() 它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。

        当使用这四个函数包含一个新文件时,该文件将作为PHP代码执行,php内核并不在意该被包含的文件是什么类型。所以如果被包含的是txt文件、图片文件、远程url、也都将作为PHP代码执行。这一特性,在实施攻击时非常有用。

其他常见文件包含函数

jsp: ava.io.file()、java.io.filereader()……

asp: include file、include virtual…….

漏洞危害

  1. 服务器安全风险:攻击者可以利用文件包含漏洞在服务器上执行任意代码,从而控制系统。这可能导致数据泄露、数据篡改、拒绝服务攻击等严重后果。
  2. 数据泄露:攻击者可以利用文件包含漏洞访问敏感数据,如用户个人信息、信用卡信息等。这可能导致严重的隐私泄露和金融欺诈。
  3. 网站可用性下降:攻击者可以利用文件包含漏洞使网站无法正常运行,从而影响用户体验和业务运营。
  4. 法律责任:如果网站未能及时修复文件包含漏洞,导致用户遭受损失,网站可能会面临法律责任。

漏洞利用

漏洞的典型特征

变量的值为一个页面:

  •  ?page=a.php
  • ?home=b.html

  • ?file=content.........

漏洞利用的前提条件 

  1. web 应用采用 include 等文件包含函数,并且需要包含的文件路径是通过用户传输参数的

    方式引入;

  2. 用户能够控制包含文件的参数,被包含的文件可被当前页面访问;

漏洞获取 webshell 的前提条件

1.攻击者需要知道文件存放的物理路径;

2.对上传文件所在目录拥有可执行权限;

3.存在文件包含漏洞;

分类

文件包含漏洞可以分为RFI(远程文件包含)LFI(本地文件包含漏洞)两种。

而区分他们最简单的方法就是php.ini 中是否开启了allow_url_include。如果开启 了我们就有可能包含远程文件。

1、本地文件包含LFI(Local File Include)

2、远程文件包含RFI(Remote File Include)(需要php.iniallow_url_include=on allow_url_fopen = On

php.ini中,allow_url_fopen默认一直是On,而allow_url_includephp5.2之后就默认为Off

截断包含

%00截断

PHP内核是由C语言实现的,因此使用了C语言中的一些字符串处理函数。在连接字符串时,0字节(\x00)将作为字符串的结束符。所以在这个地方,攻击者只要在最后加入一个0字节,就能截断file变量之后的字符串?file=../../../../../../../../../etc/passwd%00(需要 magic_quotes_gpc=offPHP小于5.3.4有效

目录长度限制截断

Win 下可以利用 256 位截断,linux 下则需要 4096 位截断,最大值长度之后的字符将被丢弃。 而利用"./"的方式即可构造出超长目录字符串。

php伪协议文件包含

常见的 php 伪协议:

file://协议,php://协议,php://filter ,php://input ,zip://, bzip2://, zlib://协议,data://协议,http:// & https:// 协议

file://协议

  • 条件:

    • allow_url_fopen:off/on
    • allow_url_include :off/on
  • 作用:
           

             用于访问本地文件系统,通常用来读取本地文件的且不受allow_url_fopen和allow_url_include的影响。
            include()/require()/include_once()/require_once()参数可控的情况下,如导入为非.php文件,则仍按照php语法进行解析,这是include()函数所决定的。

 php://协议

  • 条件:

    • allow_url_fopen:off/on
    • allow_url_include :仅php://input php://stdin php://memory php://temp 需要on

zip://, bzip2://, zlib://协议

  • 条件:

    • allow_url_fopen:off/on
    • allow_url_include :off/on
  • 作用:zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。

 data://协议

  • 条件:

    • allow_url_fopen:on
    • allow_url_include :on
  • 作用:自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。

http:// & https:// 协议

  • 条件:

    • allow_url_fopen:on
    • allow_url_include :on
  • 作用:常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。通常用于远程包含。

防护措施

1、包含目标的参数过滤

1) 文件名后缀固定:在包含的文件名前后加固定后缀;

2) 文件名过滤:白名单或者黑名单过滤;

2、路径限制

1) 目录限制,在用户提交的变量前增加固定的路径,限制用户可调用的目录范围;

2) 目录回退符过滤,避免回退符生效导致路径变化;

3、中间件的安全配置

1) Magic_quotes_gpc(5.4 以后被放弃用)

2) 限制访问区域:php.ini 中设置 open_basedir 来限制用户访问文件的活动范围

等;apache 也有相关配置

3) 设置访问权限:限制当前中间件所在用户的访问权限,例如;web 服务器独立

用户,并且只拥有访问目录和使用中间件的权限,从而有效避免越权访问其他文件;

常见系统默认路径

Windows 系统

C:\boot.ini                                                                   //查看系统版本

C:\windows\system32\inetsrv\MetaBase.xml            //IIS 配置文件

C:\windows\repair\sam                                              //存储 windows 系统初次安装的密码

C:\Program Files\mysql\my.ini                                  //mysql 配置

C:\Program Files\mysql\data\mysql\user.MYD         //Mysql root

C:\windows\php.ini                                                    //php 配置信息

Linux 系统 

/etc/passwd

/usr/local/app/apache2/conf/httpd.conf        //apache2 默认配置文件

/usr/local/app/apache2/conf/extra/httpd-vhosts.conf  //虚拟网站设置

/usr/local/app/php5/lib/php.ini            //PHP 相关配置

/etc/httpd/conf/httpd.conf                     //apache

/etc/php5/apache2/php.ini                  //ubuntu 系统的默认路径

日志默认路径 

/etc/httpd/logs/access_log 或者 /var/log/httpd/access_log        //apache+Linux 日志默认路径

D:\xampp\apache\logs\access.log

D:\xampp\apache\logs\error.log                                  //apache+win2003 日志默认路径

C:\WINDOWS\system32\Logfiles                              //IIS6.0+win2003 默认日志文件

%SystemDrive%\inetpub\logs\LogFiles                     //IIS7.0+win2003 默认日志文件

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值