CVE-2024-22243 Spring Web UriComponentsBuilder URL 解析不当漏洞分析

admin 2025年4月20日21:17:37评论8 views字数 2174阅读7分14秒阅读模式

漏洞描述

Spring Framework 是一个开源的 Java 应用程序框架,UriComponentsBuilder 是 Spring Web 中用于构建和操作 URI 的工具类。

受影响版本中,由于 UriComponentsBuilder 处理 URL 时未正确过滤用户信息中的方括号[,攻击者可构造包含方括号的恶意 URL 绕过主机名验证。如果应用程序依赖UriComponentsBuilder.fromUriString()等方法对 URL 进行解析和校验,则可能导致验证绕过,出现开放重定向或 SSRF 漏洞。

影响版本

Spring Framework

  • 6.1.0 - 6.1.3

  • 6.0.0 - 6.0.16

  • 5.3.0 - 5.3.31

  • Older, unsupported versions are also affected

漏洞分析

代码 diff

https://github.com/spring-projects/spring-framework/commit/7ec5c994c147f0e168149498b1c9d4a249d69e87

CVE-2024-22243 Spring Web UriComponentsBuilder URL 解析不当漏洞分析

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

  • patch 之后

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

其中原始的过滤中包含有一个符号[,而 diff 代码把它删除了,漏洞描述相对来叔非常清晰,由此可以构造出对应的 PoC,先搭建一个 Spring 的环境,编写对应的接口

@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:%sn", schema);  
        System.out.printf("host:%sn", host);  
        System.out.printf("path:%sn", path);  

        boolean pass = false;  
        for (String whiteDomain : whiteDomains) {  
            if (host.endsWith(whiteDomain)) {  
                pass = true;  
                break;  
            }  
        }  
        if (!pass) return "error";  

        return "redirect:" + url;  
    }  
}

为什么这里要这么编写代码呢

首先此处需要一处重定向的代码,所以最后使用return "redirect:" + url;
其次在实际的业务当中,最为常见的业务为登录注册业务,用户在输入完对应的信息后,服务器会发起一个请求如下http://drun1baby.com?redirect_url=http://drun1baby.com/dashboard,服务端会对redirect_url中的参数进行校验,确保这一请求最终会重定向到http://drun1baby.com这一个主域名中,所以在对应接口中为了更切近实际业务,增加了一个白名单。

直接编写 PoC,使用[符号来绕过,随后完成经典的 SSRF Bypass

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

成功完成恶意重定向与 SSRF,接下来简单调试一下,由于漏洞原理非常清晰,会过的比较快。

下断点进入到UriComponentsBuilder#fromUriString

CVE-2024-22243 Spring Web UriComponentsBuilder URL 解析不当漏洞分析

其中解析结果如图

CVE-2024-22243 Spring Web UriComponentsBuilder URL 解析不当漏洞分析

这样一来就可以绕过白名单的检测了,随后通过@符号发起 SSRF

CVE-2024-22243 Spring Web UriComponentsBuilder URL 解析不当漏洞分析

漏洞修复

patch 在前面已经分析过不再赘述

https://github.com/spring-projects/spring-framework/commit/7ec5c994c147f0e168149498b1c9d4a249d69e87

Ref

https://spring.io/security/cve-2024-22243

作者:【Drunkbaby】

原文始发于微信公众号(船山信安):CVE-2024-22243 Spring Web UriComponentsBuilder URL 解析不当漏洞分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月20日21:17:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2024-22243 Spring Web UriComponentsBuilder URL 解析不当漏洞分析https://cn-sec.com/archives/3979564.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息