【漏洞分析】CVE-2024-22243: Spring Framework URL Parsing with Host Validation

news/2025/2/22 23:29:21/文章来源:https://www.cnblogs.com/wh03ver/p/18112346

漏洞公告

漏洞分析

从公告中可知该漏洞关键点在 UriComponentsBuilder 这个类。通过以前的Springboot工程全局搜索可知该类在于spring-web 这个jar包里。于是我们可以diff 下 spring-web 的 5.3.315.3.32 这两个版本的jar。
image

可以看到,UriComponentsBuilder 类的改动只涉及三个正则表达式,虽然USERINFO_PATTERN 没有被引用,但从它的改动我们可以很清晰地差别,新版本的 USERINFO_PATTERN去掉了左中括号[ 。由此猜测,旧版本在解析url的时候,会由于[ 符号的存在导致解析不正确。继续分析下 URI_PATTERN,这个正则被 UriComponentsBuilder#fromUriString(String uri) 这个url解析方法使用到。

5.3.31 URI_PATTERN
^(([^:/?#]+):)?(//(([^@\[/?#]*)@)?(\[[\p{XDigit}:.]*[%\p{Alnum}]*]|[^\[/?#:]*)(:(\{[^}]+\}?|[^/?#]*))?)?([^?#]*)(\?([^#]*))?(#(.*))?5.3.32 URI_PATTERN
^(([^:/?#]+):)?(//(([^@/?#]*)@)?(\[[\p{XDigit}:.]*[%\p{Alnum}]*]|[^\[/?#:]*)(:(\{[^}]+\}?|[^/?#]*))?)?([^?#]*)(\?([^#]*))?(#(.*))?

由于该正则较复杂,看的头疼,于是直接扔给 GPT分析:
image

GPT给我的答案还是很准的,直击要害的。
意思就是,5.3.31版本中,url的userinfo部分(即 @前面的部分),是不能包含 @[?# 符号的,如果@出现了这几个符号,则@前面的部分便不会认为是userInfo,因此也会导致 host部分(即@后面的部分)解析出错。
以 url https://mole.sh[@evil.com,按理正确的解析出userinfo部分应为:mole.sh[,host的部分应为:evil.com ,但实际按照 5.3.31 版本的这个正则,解析出的host 却是 mole.sh

写个使用demo程序调试下:

@Testvoid testCVE_2024_22243() throws MalformedURLException {String url = "https://mole.sh[@evil.org";String normalizeUrl = UriComponentsBuilder.fromUriString(url).build().normalize().toString();System.out.println("normalizedUrl:" + normalizeUrl);System.out.println("url:" + url);URL tmpUrl = new URL(url);String host = tmpUrl.getHost();System.out.println("url host: " + host);URL norUrl = new URL(normalizeUrl);String host1 = norUrl.getHost();System.out.println("norUrl host: " + host1);}

调试结果对比如下,印证了我们的分析:
image

image

另外,从最后的运行输出结果可以看到,5.3.31 版本,经过 UriComponentsBuilder#fromUriString() 处理过后的url,在 mole.sh后面加了个反斜杠/,这样在 URL#getHost() 肯定得到的就是 mole.sh。所以如果在发起请求前,使用了UriComponentsBuilder 对url进行解析并针对SSRF、Open Redirect进行安全校验,那么在构造URL对象后,得到的host就不会是evil.com,从而绕过校验。
image

小结

虽然Spring官方对该漏洞的评级是High,但个人认为该漏洞还是比较鸡肋的,完全取决于产品开发是如何实现具体逻辑。而且现在很多产品都直接将url配在了配置中心。除非能修改配置中心,但如果能篡改配置,直接SpEL注入实现RCE不更香么...
查了下阿里云AVD的高危漏洞列表,果然榜上无名,评级为中危。

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

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

相关文章

【漏洞分析】CVE-2024-22259: Spring Framework URL Parsing with Host Validation (2nd report)

漏洞公告漏洞分析 这个漏洞本质上跟之前的CVE-2024-22243是同一个问题,且之前官方修复的不完全,导致还是可以被绕过。 这一点,官方在公告里也提到了。 补丁diff下,能看到其实还是url解析的那个正则表达式的修改: //5.3.31的正则: ^(([^:/?#]+):)?(//(([^@/?#]*)@)?(\…

用AOT导出本地dll

记得之前在做医保接口时,经常要调一些C++或delphi写的本地dll(这些dll通常是用来读医保卡之类),这里简单介绍一下用C#生成本地可以直接调用dll,具体做法是通过UnmanagedCallersOnlyAttribute来完成。dll项目文件如下<Project Sdk="Microsoft.NET.Sdk"><…

AOT反射库-AOTReflection

在AOT项目中,使用反射有一些问题,本程序包利用源生成器,按不同的维度,提前获取对应类型的元数据,从而达到平滑使用Reflection部分功能。项目:https://github.com/axzxs2001/AOTReflectionnuget:https://www.nuget.org/packages?q=AOTReflection如下面代码,利用泛型的反…

快乐地在AOT项目中用反射

反射是.NET开发的利器,但对于AOT来说,因为Native编译,所以反射的功能基本在AOT编译的项目中失效。办法总比困难多,这么好的东西不能扔掉,下面是“尽量”可以使用反射的例子,为什么“尽量”,看完下面的案例我们再做说明。在AOT项目中使用反射基本原理:利用源生成器,在b…

10亿数据,如何做迁移?

前言 某次金融系统迁移项目中,原计划8小时完成的用户数据同步迟迟未能完成。 24小时后监控警报显示:由于全表扫描SELECT * FROM users导致源库CPU几乎熔毁,业务系统被迫停机8小时。 这让我深刻领悟到——10亿条数据不能用蛮力搬运,得用巧劲儿递接! 今天这篇文章,跟大家一…

2025.2.21的模拟赛题“糖果”题解

2025.2.21的模拟赛题“糖果”题解为避免混淆,题目中的 \(X\) 在下文中为大写。 称前 \(k-1\) 次操作成为1号操作,第 \(k\) 次(不含)以后的操作称作2号操作 设 \(f_{x,i,j}\) 表示在 \(x\) 的子树中,1号操作做了 \(i\) 次,2号操作做了 \(j\) 次 限制就是\(X\) 到跟的路径不…

【飞书】Zabbix 7.2 告警与飞书机器人深度联动的全流程

midnight, the sound of a phone buzzing wakes you up abruptly. "又是告警!"你猛地从床上坐起,眼睛酸涩地盯着手机屏幕。作为一名运维工程师,这样的场景几乎成了家常便饭。无论是深夜还是清晨,系统故障总能找到你的联系方式,仿佛在提醒你:科技24小时不眠不休…

Windows平台上Idea、Tomcat、浏览器页面显示乱码问题解决

核心:乱码问题是由于字符编码不一致导致的,所以解决乱码问题的核心概念是统一字符编码。首先我们查看各个平台的字符编码: Windows cmd中输入chcp 命令查看(Windows系统默认字符编码时GBK)936 代表 GBK 65001 代表 UTF-8 注意:通过chcp命令如 chcp 65001 来更改字符编码只…

关于 xrlong 是神的论证

xrlong orz搜索内容搜索结果__________________________________________________________________________________________本文来自博客园,作者:CuFeO4,转载请注明原文链接:https://www.cnblogs.com/hzoi-Cu/p/18729881

idea插件+cursor使用技巧

cursorignore配置# Compiled files *.class *.jar *.war# Build directories target/ build/# IDE files .idea/ *.iml .vscode/ .project .classpath .settings/# Logs *.log logs/# Temporary files *.tmp *.bak *.swp# Maven specific .mvn/ mvnw mvnw.cmd# Spring Boot spe…

设计测试用例方法 -经验方法(三种)

1、基于经验的测试技术之错误推测法 错误推测法也叫错误猜测法,就是根据经验猜想,已有的缺陷,测试经验和失败数据等可能有什么问题并依此设计测试用例2、基于经验的测试技术之异常分析法 系统异常分析法就是针对系统有可能存在的异常操作、软硬件缺陷引起的故障进行分析,依…

DeepSeek 即将发布 5 个开源项目;Cartesia Voice Changer:声音转换、克隆和实时语音翻译丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…