CVE-2024-22243 Spring Web UriComponentsBuilder URL 解析不当漏洞分析
字数 1730 2025-08-18 11:35:30

Spring Web UriComponentsBuilder URL 解析不当漏洞(CVE-2024-22243)分析文档

漏洞概述

漏洞编号: CVE-2024-22243
影响组件: Spring Framework中的UriComponentsBuilder
漏洞类型: URL解析不当导致的验证绕过
潜在风险: 开放重定向、SSRF(服务器端请求伪造)
披露时间: 2024年2月26日

受影响版本

  • Spring Framework的多个版本受影响
  • 包括一些较旧且不再支持的版本

漏洞背景

UriComponentsBuilder是Spring Web中用于构建和操作URI的工具类。在受影响版本中,该类处理URL时未正确过滤用户信息(userinfo)部分中的方括号[,导致攻击者可构造包含方括号的恶意URL绕过主机名验证。

漏洞原理分析

关键代码差异

漏洞修复前后的正则表达式对比:

修复前:

[^@[/?#]* 

表示匹配除了特定字符@[/?#之外的任意字符零次或多次。

修复后:

[^@/?#]* 

表示匹配除了特定字符@/?#之外的任意字符零次或多次。

关键变化是移除了对[字符的过滤。

漏洞利用场景

当应用程序依赖UriComponentsBuilder.fromUriString()等方法对URL进行解析和校验时,攻击者可构造包含方括号的恶意URL绕过主机名验证,可能导致:

  1. 开放重定向:将用户重定向到恶意网站
  2. SSRF漏洞:绕过服务端对目标地址的限制

漏洞复现与分析

漏洞环境搭建

示例漏洞控制器代码:

@Controller
@RequestMapping("/vul")
public class VulController {
    private static final Set<String> whiteDomains = new HashSet<>(Arrays.asList(new String[]{".a.com"}));
    
    @GetMapping
    public String vul(@RequestParam(name = "url") String url, HttpServletResponse response) throws IOException {
        UriComponents uriComponents = UriComponentsBuilder.fromUriString(url).build();
        String schema = uriComponents.getScheme();
        String host = uriComponents.getHost();
        String path = uriComponents.getPath();
        
        System.out.printf("schema:%s\n", schema);
        System.out.printf("host:%s\n", host);
        System.out.printf("path:%s\n", path);
        
        boolean pass = false;
        for (String whiteDomain : whiteDomains) {
            if (host.endsWith(whiteDomain)) {
                pass = true;
                break;
            }
        }
        
        if (!pass) return "error";
        return "redirect:" + url;
    }
}

漏洞利用POC

构造恶意URL绕过白名单验证:

http://127.0.0.1:8080/vul?url=http%3A%2F%2Fwww.a.com%5B%40www.baidu.com

解析过程:

  1. 原始URL: http://www.a.com[@www.baidu.com
  2. UriComponentsBuilder解析时,由于[未被过滤,导致:
    • www.a.com[识别为用户信息(userinfo)部分
    • @www.baidu.com识别为主机名
  3. 白名单检查.a.com时,实际检查的是www.baidu.com,从而绕过验证

调试分析

UriComponentsBuilder#fromUriString方法中设置断点,可以观察到:

  1. 攻击者提供的URL被解析为包含[字符的特殊格式
  2. 解析后的主机名部分被篡改为攻击者控制的域名
  3. 白名单验证被成功绕过

漏洞修复方案

官方修复

Spring团队通过以下commit修复了该漏洞:
https://github.com/spring-projects/spring-framework/commit/7ec5c994c147f0e168149498b1c9d4a249d69e87

主要修改:

  1. 从用户信息(userinfo)部分的正则表达式中移除了[字符
  2. 确保方括号被正确处理,不再作为有效字符出现在用户信息部分

升级建议

  1. 升级到Spring Framework的最新安全版本
  2. 如果无法立即升级,可考虑以下临时缓解措施:
    • 对输入URL进行额外的验证
    • 实现自定义的URL解析逻辑,严格过滤特殊字符

安全建议

  1. 输入验证:对所有用户提供的URL进行严格验证
  2. 白名单机制:使用严格的白名单而非黑名单进行域名验证
  3. 深度防御:在多个层次实施防护措施,不依赖单一验证机制
  4. 安全编码:避免直接将用户输入用于重定向操作

参考资源

  1. 官方漏洞公告: https://spring.io/security/cve-2024-22243
  2. 修复commit: https://github.com/spring-projects/spring-framework/commit/7ec5c994c147f0e168149498b1c9d4a249d69e87

总结

CVE-2024-22243漏洞源于Spring Framework中UriComponentsBuilder对URL解析时的不当处理,特别是对[字符的过滤不充分。攻击者可利用此漏洞绕过主机名验证,导致开放重定向或SSRF攻击。开发者应及时升级到修复版本,并在代码中实施严格的安全验证措施。

Spring Web UriComponentsBuilder URL 解析不当漏洞(CVE-2024-22243)分析文档 漏洞概述 漏洞编号 : CVE-2024-22243 影响组件 : Spring Framework中的UriComponentsBuilder 漏洞类型 : URL解析不当导致的验证绕过 潜在风险 : 开放重定向、SSRF(服务器端请求伪造) 披露时间 : 2024年2月26日 受影响版本 Spring Framework的多个版本受影响 包括一些较旧且不再支持的版本 漏洞背景 UriComponentsBuilder是Spring Web中用于构建和操作URI的工具类。在受影响版本中,该类处理URL时未正确过滤用户信息(userinfo)部分中的方括号 [ ,导致攻击者可构造包含方括号的恶意URL绕过主机名验证。 漏洞原理分析 关键代码差异 漏洞修复前后的正则表达式对比: 修复前 : 表示匹配除了特定字符 @ 、 [ 、 / 、 ? 、 # 之外的任意字符零次或多次。 修复后 : 表示匹配除了特定字符 @ 、 / 、 ? 、 # 之外的任意字符零次或多次。 关键变化是移除了对 [ 字符的过滤。 漏洞利用场景 当应用程序依赖 UriComponentsBuilder.fromUriString() 等方法对URL进行解析和校验时,攻击者可构造包含方括号的恶意URL绕过主机名验证,可能导致: 开放重定向 :将用户重定向到恶意网站 SSRF漏洞 :绕过服务端对目标地址的限制 漏洞复现与分析 漏洞环境搭建 示例漏洞控制器代码: 漏洞利用POC 构造恶意URL绕过白名单验证: 解析过程: 原始URL: http://www.a.com[@www.baidu.com UriComponentsBuilder解析时,由于 [ 未被过滤,导致: 将 www.a.com[ 识别为用户信息(userinfo)部分 将 @www.baidu.com 识别为主机名 白名单检查 .a.com 时,实际检查的是 www.baidu.com ,从而绕过验证 调试分析 在 UriComponentsBuilder#fromUriString 方法中设置断点,可以观察到: 攻击者提供的URL被解析为包含 [ 字符的特殊格式 解析后的主机名部分被篡改为攻击者控制的域名 白名单验证被成功绕过 漏洞修复方案 官方修复 Spring团队通过以下commit修复了该漏洞: https://github.com/spring-projects/spring-framework/commit/7ec5c994c147f0e168149498b1c9d4a249d69e87 主要修改: 从用户信息(userinfo)部分的正则表达式中移除了 [ 字符 确保方括号被正确处理,不再作为有效字符出现在用户信息部分 升级建议 升级到Spring Framework的最新安全版本 如果无法立即升级,可考虑以下临时缓解措施: 对输入URL进行额外的验证 实现自定义的URL解析逻辑,严格过滤特殊字符 安全建议 输入验证 :对所有用户提供的URL进行严格验证 白名单机制 :使用严格的白名单而非黑名单进行域名验证 深度防御 :在多个层次实施防护措施,不依赖单一验证机制 安全编码 :避免直接将用户输入用于重定向操作 参考资源 官方漏洞公告: https://spring.io/security/cve-2024-22243 修复commit: https://github.com/spring-projects/spring-framework/commit/7ec5c994c147f0e168149498b1c9d4a249d69e87 总结 CVE-2024-22243漏洞源于Spring Framework中UriComponentsBuilder对URL解析时的不当处理,特别是对 [ 字符的过滤不充分。攻击者可利用此漏洞绕过主机名验证,导致开放重定向或SSRF攻击。开发者应及时升级到修复版本,并在代码中实施严格的安全验证措施。