CVE-2024-22259(CVE-2024-22243绕过)浅析
字数 1522 2025-08-18 17:33:25
CVE-2024-22259 (CVE-2024-22243绕过) 深入分析与防护指南
漏洞概述
CVE-2024-22259是Spring框架中对CVE-2024-22243修复不充分导致的补充漏洞,影响Spring Web中的UriComponentsBuilder组件。该漏洞允许攻击者构造特殊URL绕过主机名验证,可能导致开放重定向(Open Redirect)或服务器端请求伪造(SSRF)攻击。
受影响版本
- Spring Framework 6.0.0 - 6.0.16
- Spring Framework 5.3.0 - 5.3.31
- 其他基于这些版本的Spring衍生框架
漏洞原理
UriComponentsBuilder功能
UriComponentsBuilder是Spring Web中用于构建和操作URI的工具类,提供链式API来构造URI。
CVE-2024-22243原始漏洞
原始漏洞(CVE-2024-22243)允许通过以下方式绕过主机验证:
- 使用
UriComponentsBuilder.fromHttpUrl()解析URL - 在URL中使用
\反斜杠字符 - 导致主机名验证被绕过
CVE-2024-22259绕过方式
Spring对CVE-2024-22243的修复不充分,攻击者仍可通过两种方式绕过:
方式一:使用UriComponentsBuilder.fromUriString()
UriComponentsBuilder.fromUriString("http://evil.com\\@trusted.com").build().toUri()
方式二:使用UriComponentsBuilder.fromUri()结合UriComponentsBuilder.fromHttpUrl()
UriComponentsBuilder.fromUri(
UriComponentsBuilder.fromHttpUrl("http://evil.com\\@trusted.com").build().toUri()
).build().toUri()
这两种方式都能构造出绕过主机名验证的URL,导致请求被重定向到恶意网站或发起SSRF攻击。
漏洞利用场景
- 开放重定向:当应用程序使用UriComponentsBuilder处理用户提供的URL进行重定向时
- SSRF攻击:当应用程序使用UriComponentsBuilder构建URL并用于服务器端请求时
漏洞验证方法
验证代码示例
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;
public class VulnerabilityTest {
public static void main(String[] args) {
// 方式一验证
URI uri1 = UriComponentsBuilder.fromUriString("http://evil.com\\@trusted.com").build().toUri();
System.out.println("方式一结果: " + uri1); // 应显示指向evil.com的URI
// 方式二验证
URI uri2 = UriComponentsBuilder.fromUri(
UriComponentsBuilder.fromHttpUrl("http://evil.com\\@trusted.com").build().toUri()
).build().toUri();
System.out.println("方式二结果: " + uri2); // 应显示指向evil.com的URI
}
}
预期输出
如果系统存在漏洞,输出将显示URI指向evil.com而非trusted.com。
修复方案
官方修复
Spring Framework已发布修复版本:
- 6.0.x用户升级到6.0.17+
- 5.3.x用户升级到5.3.32+
临时缓解措施
如果无法立即升级,可采取以下措施:
- 输入验证:对所有用户提供的URL进行严格验证
- 白名单验证:只允许特定的可信域名
- 自定义UriComponentsBuilder包装器:
public class SafeUriComponentsBuilder {
public static UriComponentsBuilder fromUriStringSafe(String uri) {
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(uri);
validateHost(builder.build().getHost());
return builder;
}
private static void validateHost(String host) {
if (host == null || host.contains("\\") || host.contains("/")) {
throw new IllegalArgumentException("Invalid host name");
}
// 添加额外的白名单验证
}
}
防御最佳实践
- 永远不要直接使用用户提供的URL进行重定向或请求
- 实施严格的URL验证:
- 验证协议(只允许http/https)
- 验证主机名(白名单机制)
- 检查特殊字符
- 使用相对URL:尽可能使用相对路径而非完整URL
- 记录和监控:记录所有重定向操作和外部请求
漏洞影响评估
- CVSS评分:6.1 (中等)
- 攻击复杂度:低
- 用户交互:需要(开放重定向场景)
- 影响范围:取决于应用程序如何使用UriComponentsBuilder
相关CVE
- CVE-2024-22243:原始漏洞,通过
\字符绕过主机验证 - CVE-2024-22259:修复不充分导致的绕过漏洞
总结
CVE-2024-22259展示了即使修复了安全漏洞,也可能存在不充分的补丁导致新的绕过方式。开发者应当:
- 及时升级到安全版本
- 实施深度防御策略
- 对用户提供的所有输入进行严格验证
- 定期进行安全审计和代码审查
通过全面理解此漏洞的原理和利用方式,开发者可以更好地保护Spring应用程序免受类似攻击。