文件包含漏洞简介

漏洞原理   

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

漏洞场景

       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 默认日志文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 Apache Doris 的实时/离线一体化架构,赋能中国联通 5G 全连接工厂解决方案

作者:田向阳,联通西部创新研究院 大数据专家 共创:SelectDB 技术团队 导读: 数据是 5G 全连接工厂的核心要素,为支持全方位的数据收集、存储、分析等工作的高效进行,联通 5G 全连接工厂从典型的 Lambda 架…

Flutter 中的 CupertinoSliverRefreshControl 小部件:全面指南

Flutter 中的 CupertinoSliverRefreshControl 小部件:全面指南 Flutter 是一个流行的跨平台 UI 框架,它允许开发者使用 Dart 语言来构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的滚动组件中,CupertinoSliverRefreshControl 是一个…

数据排序的艺术:快速排序及其优化之旅

快速排序:从基础到优化 快速排序是计算机科学中最著名的排序算法之一,由C. A. R. Hoare在1960年提出。它是一种分治法策略的应用,广泛用于各种场景,从数据库的查询优化到大数据处理,再到我们日常使用的文件排序。 快…

Presto 从提交SQL到获取结果 源码详解(3)

物理执行计划 回到SqlQueryExecution.startExecution() ,执行计划划分以后, // 初始化连接,获取Connect 元数据,添加会话,初始ConnectId metadata.beginQuery(getSession(), plan.getConnectors()); // 构建物理执行…

mongodb 集合复制---聚合管道操作符$out来实现

1.集合复制 要将数据从一个集合复制到另一个集合------可以使用聚合管道操作符$out来实现。 $out操作符将聚合管道的结果写入到指定的集合中,可以是 已存在的集合 或者 新创建的集合 以下是一个示例聚合管道操作,将数据从一个集合复制到另一个集合&am…

AngularJS基础语法(2009版本)

jquery和AngularJS 数据绑定和获取对比: jquery,要操作DOM: angularJS,无需操作DOM就可以进行动态数据变化: 要使用Angularjs就需要在html页面先引入: ng-app: html页面中,需要给…

redis(17):什么是布隆过滤器?如何实现布隆过滤器?

1 布隆过滤器介绍 布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它基于位数组和多个哈希函数的原理,可以高效地进行元素的查询,而且占用的空间相对较小,如下图所示: 根据 key 值计算出它的存储位置,然后将此位置标…

如何理解SQL注入原理

基础概念 SQL注入(SQL Inject)指的是web应用程序对用户输入数据的合法性没有判断或过滤不严格,使得攻击者能够在web应用程序中事先定义好的查询语句的结尾添加额外的SQL语句。这些额外的SQL语句能够在管理员不知情的情况下执行&#…

API测试工具领域,Postman的10个最佳替换

Postman 赢得了流行且有效的 API 工具的声誉。然而,对于那些寻求更符合特定需求和偏好的替代方案的人来说,存在一些值得注意的选择。这些 Postman 替代方案提供了独特的特性和功能,可满足测试过程的各个方面的需求。 在本博客中,…

如何快速的在线编辑pdf?6个软件让你轻松编辑pdf

如何快速的在线编辑pdf?6个软件让你轻松编辑pdf 在线编辑PDF文件是一项非常方便的任务,以下是六款让您轻松进行在线PDF编辑的软件: 嗨动PDF编辑器:这是一个功能强大的PDF编辑器,可以帮助您快速编辑PDF文档&#xff…

Flutter 中的 SliverAnimatedList 小部件:全面指南

Flutter 中的 SliverAnimatedList 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它提供了丰富的组件来帮助开发者构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的滚动组件中,SliverAnimatedList 是一个特殊的组件…

封装了一个iOS对号成功动画

基本思路其实很简单,就是通过贝塞尔曲线画出路径,然后 使用CAShapeLayer 渲染路径,然后通过strokeEnd 动画实现 路径的效果,这里注意,这个过程中过遇到过一个问题,就是 对号动画完成之后,整个对…

Superset二次开发之更新 SECRET_KEY

SECRET_KEY 的作用 加密和签名:SECRET_KEY用于对敏感数据(如会话、cookie、CSRF令牌)进行加密和签名,防止数据被篡改。安全性:确保应用的安全性,防止跨站请求伪造(CSRF)攻击和会话劫持等安全问题。如何生成 SECRET_KEY openssl rand -base64 42 配置 SECRET_KEY 在sup…

【主动均衡和被动均衡】

文章目录 1.被动均衡2.主动均衡1.被动均衡 被动均衡一般通过电阻放电的方式,对电压较高的电池进行放电,以热量形式释放电量,为其他电池争取更多充电时间。这样整个系统的电量受制于容量最少的电池。充电过程中,锂电池一般有一个充电上限保护电压值,当某一串电池达到此电压…

uniapp 添加字体ttf

效果图如下 一、逻辑概述 在uniapp中使用字体,一共分成两种情况,一种是普通vue页面,一种是nvue页面引入字体。。 1.vue页面引入字体需要如下步骤 1. 先选择下载一种字体:字体格式一般为 ttf后缀名 黄凯桦律师手写体免费下载和在线…

Linux--EXT2文件系统

参考资料: linux之EXT2文件系统--理解block/block group/索引结点inode/索引位图_一个块组中索引节点表和数据块区最多占用字节-CSDN博客 linux环境: Linux version 5.15.146.1-microsoft-standard-WSL2 (root65c757a075e2) (gcc (GCC) 11.2.0, GNU ld…

Vue前端如何配合SpringBoot后端实现文件下载

从HTML页面下载文件是非常简单的,直接向后端发起请求,后端处理请求就可以了;但是如果前端使用Vue开发,那么实现文件下载就有些曲折:Vue前端本身作为服务端存在,为了实现下载就需要将请求通过代理转到后端服…

Java后端模拟面试 题集⑤

1.先作个自我介绍吧 面试官您好,我叫张睿超,来自湖南长沙,大学毕业于湖南农业大学,是一名智能科学与技术专业的统招一本本科生。今天主要过来面试贵公司的Java后端开发工程师岗位。 大学里面主修的课程是Java、Python、数字图像…

FreeRtos进阶——中断的内部逻辑

中断与非中断API的区别 BaseType_t xQueueSendToBack(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait); BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWok…

Session+Redis,Token+Redis,JWT+Redis,用户身份认证,到底选择哪种更合适?

1三中方案的比较 在选择Session+Redis、Token+Redis、JWT+Redis这三种用户身份认证方案时,我们需要考虑各自的优势、劣势以及应用场景。以下是对这三种方案的详细分析和比较: 1. Session+Redis 优势: Session登录是一种在Web应用程序中用于跟踪用户状态的机制,通过在服务…