路径穿越浅析

当使用 RouterFunctions 来处理静态资源且资源处理通过 FileSystemResource 进行配置时,攻击者可以通过构造恶意 HTTP 请求,利用路径遍历漏洞获取相关受影响版本文件系统中的任意文件。
在这里插入图片描述
主要影响范围:

Spring Framework

5.3.0 - 5.3.39
6.0.0 - 6.0.23
6.1.0 - 6.1.12
Older, unsupported versions are also affected
当使用 RouterFunctions 来处理静态资源且资源处理通过 FileSystemResource 进行配置时,攻击者可以通过构造恶意 HTTP 请求,利用路径遍历漏洞获取相关受影响版本文件系统中的任意文件。以WebFlux为例,分析具体的成因。

0x01 漏洞分析与复现
1.1 分析过程
查看具体的修复commit:https://github.com/spring-projects/spring-framework/commit/d86bf8b2056429edf5494456cffcb2b243331c49#diff-25869a3e3b3d4960cb59b02235d71d192fdc4e02ef81530dd6a660802d4f8707

可以看到主要是对PathResourceLookupFunction进行了相关的加固处理,调整了 RouterFunctions 资源处理逻辑。

org.springframework.web.reactive.function.server.PathResourceLookupFunction 是 Spring WebFlux 中用于查找资源的函数,它通常与 RouterFunction 一起使用,以便在响应式路由中处理静态资源请求。这个函数的作用是将请求的路径映射到文件系统中的资源,如图片、样式表或 JavaScript 文件等。

主要解析处理是在apply方法进行的,下面看看具体的解析过程:

首先从 ServerRequest 中提取路径容器 PathContainer,它包含了应用程序上下文中的路径。首先检查提取的路径是否与预定义的模式匹配。如果不匹配,返回一个空。
如果路径匹配,使用 this.pattern.extractPathWithinPattern 方法提取模式内的路径部分,并将其传递给 processPath 方法进行进一步处理。
如果处理后的路径包含百分号编码,则使用 StringUtils.uriDecode 方法对其进行解码。检查解码后的路径是否有效,主要是是否非空且不是非法路径(通过isInvalidPath进行判断)
最后如果是有效的路径,尝试创建一个 Resource 对象。并返回对应的内容。
在这里插入图片描述
查看下processPath方法的具体实现,其主要用于处理和规范化文件路径字符串。该方法的主要作用是确保路径以正斜杠(/)开始,并且移除路径中不必要的部分:

在这里插入图片描述
isInvalidPath方法实现如下,主要是限制了一些路径中常出现的字符字符,防止目录穿越攻击:
在这里插入图片描述
以上是PathResourceLookupFunction的大致处理过程。具体的安全措施可以看到主要是对…/这类的穿越符进行了处理。

下面对比下加固后的PathResourceLookupFunction,看看具体的安全措施:

首先processPath进行了相关的改动,首先替换反斜线为斜线:

在这里插入图片描述
并调用cleanDuplicateSlashes去掉了多余的斜线:
在这里插入图片描述
在调用processPath处理后,还调用了isInvalidEncodedInputPath方法进行安全检查,如果为true则返回空:
在这里插入图片描述
isInvalidEncodedInputPath具体实现如下,主要作用是检查给定的路径字符串是否包含不合法的编码输入,可以看到当path路径中存在%号时,首先会进行URL解码,然后通过isInvalidPath进行判断,然后再经过一层processPath转换,这里意图应该是替换反斜线为斜线并去除多余的斜线,然后再进行一次isInvalidPath检查:
在这里插入图片描述
在这里插入图片描述
最后还修改了isResourceUnderLocation的判断逻辑,把原来的解码后判断是否包含…/修改成了isInvalidEncodedInputPath方法进行检查:

风险版本
在这里插入图片描述
修复版本
在这里插入图片描述
从修复代码看,猜测相关的利用主要与反斜线以及URL编码有关。尝试进行复现。

1.2 漏洞复现
1.2.1 环境搭建
根据之前的分析,反斜线很自然就联想到在Windows中能通过…\的方式来目录穿越。尝试在Windows环境下进行复现,通过RouterFunction模拟相关的静态资源映射:
在这里插入图片描述
通过上述映射,即可以通过/portal路由访问C盘Log目录下的静态资源。

spring相关版本:

在这里插入图片描述
1.2.2 复现过程
直接…/…/windows/win.ini方式尝试利用肯定是不行的。因为在isInvalidPath中会调用cleanPath进行处理,然后判断处理后的路径是否包含…/。其中会对反斜线进行相关的转换,最终会认为是非法路径:

在这里插入图片描述
结合前面的分析可以考虑URL编码,首先Spring自身会对路径做一层解码。所以得编码两次。例如下面的例子,此时isInvalidPath判断的是…%5c,不会认为是非法字符:

…%255c/…%255c/…%255c/windows/win.ini
然后调用createRelativeURL完成相应的封装:
在这里插入图片描述
在对应URL调用时,getInputStream中openConnection会再解码一次。此时即可绕过相关的安全限制。以读取Downloads下的test.txt为例。可以看到最终成功绕过对应的限制,跨目录获取到了相关的文件:
在这里插入图片描述
0x02 其他
实际上Spring历史上也出现过类似的风险,ResourceHttpRequestHandler 是 Spring MVC 中用于处理静态资源请求的一个关键组件。它实现了 HttpRequestHandler 接口,专门用于映射和处理静态资源文件的请求。

对比ResourceHttpRequestHandler和PathResourceLookupFunction的代码,其实在processPath的实现上是类似的。

org.springframework.web.reactive.function.server.PathResourceLookupFunction(Spring-WebFlux):
在这里插入图片描述
org.springframework.web.servlet.resource.ResourceHttpRequestHandler#getResource:在这里插入图片描述
两者均是对反斜线进行了相关的处理,相对于ResourceHttpRequestHandler而言,主要是为了修复CVE-2018-1271:
在这里插入图片描述
除此之外,还可以看到其他漏洞的痕迹,spring-cloud-config历史目录穿越中,对于CVE-2019-3799的利用同样也是基于createRelative的逻辑,才会有类似双重URL编码的绕过利用:

…%252F…%252F…%252F…%252F…%252F…%252F…%252F…%252F…%252F…%252F…%252F…%252Fetc%252Fpasswd
在这里插入图片描述
感觉CVE-2024-38816的利用类似CVE-2019-3799和CVE-2018-1271的结合。

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

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

相关文章

【网络安全渗透测试零基础入门】之Vulnhub靶场PWNOS: 2.0 多种渗透方法,收藏这一篇就够了!

前言 这是小强给粉丝盆友们整理的网络安全渗透测试入门阶段Vulnhub靶场实战教程 喜欢的朋友们,记得给我点赞支持和收藏一下,关注我,学习黑客技术。 本文介绍靶机PWNOS: 2.0 的渗透方法,由于靶机系统比较老,尝试了几种…

【缓存策略】你知道 Write Around(缓存绕过写)这个缓存策略吗?

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

JavaScript入门笔记

目录 JavaScript 介绍 1.JavaScript书写位置 1.1内部 js 1.2外部 js 2.输入和输出语法 变量 1.变量是什么 2.变量基本使用 2.1变量的声明 2.2变量的赋值 3.数组 常量 数据类型 1.数据类型 1.1基本数据类型 1.1.1.number: 数字型 1.1.2.string: 字符串型 1.1.…

游戏引擎学习第七天

视频参考:https://www.bilibili.com/video/BV1QFmhYcE69 ERROR_DEVICE_NOT_CONNECTED 是一个错误代码,通常在调用 XInputGetState 或 XInputSetState 函数时返回,表示指定的设备未连接。通常会出现以下几种情况: 未连接控制器:如…

IDE内存不足,这可能会影响性能。请考虑增加堆大小。

警告信息:Low Memory The IDE is running low on memory and this might affect performance. Please consider increasing available heap. 解决方案: 重启即可。

Element plus使用menu时候如何在折叠时候隐藏掉组件自带的小箭头

记录一下工作中使用element plus时候遇到的一个小bug 就是这个小箭头太折磨人了,因为我需要根据路由动态加载menu,所以对这个menu组件进行了一些处理,然后可能是因为破坏了它原来的层级关系吧导致折叠菜单的时候这个小箭头还在(官…

语义通信论文略读(七)Contrastive Learning-Based Semantic Communications

Contrastive Learning-Based Semantic Communications 基于对比学习的语义通信 作者: Shunpu Tang, Qianqian Yang, Lisheng Fan, Xianfu Lei, Arumugam Nallanathan, George K. Karagiannidis 所属机构: 广州大学计算机科学与网络安全学院,浙江大学信息科学与电…

windows下QT5.12.11使用MSVC编译器编译mysql驱动并使用详解

1、下载mysql开发库,后面驱动编译的时候需要引用到,下载地址:mysql开发库下载 2、使用everything搜索:msvc-version.conf,用记事本打开,添加:QMAKE_MSC_VER=1909。不然msvc下的mysql源码加载不上。

技术栈2:Git分布式版本控制工具

目录 1.版本控制器 2.Git概述 3.Git常用命令 4.获取本地仓库 5.基础操作指令 6.gitignore文件 7.分支与合并 8.远程仓库 1.版本控制器 1.1集中式版本控制器 集中式版本控制工具,版本库是集中存放在中央服务器的,team里每个人work时…

【ARM Coresight OpenOCD 系列 5 -- arp_examine 使用介绍】

文章目录 OpenOCD arp_examine 使用 OpenOCD arp_examine 使用 因为我们很多时候运行 Openocd 的时候有些 core 还没有启动, 所以最好在配置脚本中添加 -defer-examine这个参数, 如下: #cortex-m33 target create ${_CHIPNAME}.m33 cortex_m -dap ${_CHIPNAME}.da…

计算机毕业设计Python+大模型斗鱼直播可视化 直播预测 直播爬虫 直播数据分析 直播大数据 大数据毕业设计 机器学习 深度学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

CAN总线位同步的使用以及总线仲裁规则详解

目录 1. 位同步 1.1 位时序 1.2 硬同步 1.3 再同步 1.4 波特率计算 2. 仲裁 2.1 先占先得 2.2 非破坏性仲裁 1. 位同步 CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长,发送方以约定的位时长每隔固定时…

Python爬虫开发中的分析与方案制定

网站分析作为获取数据的重要手段,其重要性不言而喻。Python作为一种强大的编程语言,因其简洁的语法和强大的库支持,成为开发爬虫的首选工具。本文将深入探讨Python爬虫开发中的分析与方案制定,并在代码中加入代理信息,…

深入理解接口测试:实用指南与最佳实践5.0(一)

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

基于Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用,森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数,造成重大的损失。如果有一款监测软件,从硬件处获得的图像中监测是否有火焰,从而报警&#xff0…

Python酷库之旅-第三方库Pandas(209)

目录 一、用法精讲 976、pandas.MultiIndex.set_codes方法 976-1、语法 976-2、参数 976-3、功能 976-4、返回值 976-5、说明 976-6、用法 976-6-1、数据准备 976-6-2、代码示例 976-6-3、结果输出 977、pandas.MultiIndex.to_frame方法 977-1、语法 977-2、参数…

SQL 窗口函数

窗口函数用于在不改变查询结果集行数的情况下,对每一行执行聚合计算或其他复杂的计算,可以跨行计算。 随着窗口函数的出现,无须再使用关联子查询。窗口函数的可读性很好,代码也很简洁。 1 实践 1.1 营业额年度变化 需求&#…

36.Redis核心设计原理

本文针对前面的讲解做一次总结 1.Redis基本特性 1.非关系型的键值对数据库,可以根据键以O(1)的时间复杂度取出或插入关联值 2.Redis的数据是存在内存中的 3.键值对中键的类型可以是字符串,整型,浮点型等,且键是唯一的 4.键值对中…

《人工智能网络安全现状(2024)》深度解读:机遇、挑战与应对策略

在当今数字化浪潮汹涌澎湃的时代,人工智能(AI)与网络安全已然深度交融,二者相互作用所塑造的发展态势正深刻重塑着我们的信息安全格局。《人工智能网络安全现状(2024)》这份报告恰似一盏明灯,为…

光控资本 :股票支撑位是什么?股票支撑位怎么找?

股票支撑位是指在股票价格的前史K线走势有两次或者两次以上,出现下跌到某一方位,股票就出现反弹的走势,则投资者可以把这个方位称为支撑位,支撑位阐明下方托单较多,个股无法持续下跌,在托单的影响下&#x…