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

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

船山信安 2025-04-19 16:00

漏洞描述

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

image

[^@\[/?#]*
: 表示匹配除了特定字符@
,[
,/
,?
,#
之外的任意字符零次或多次。
– 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:%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;  
    }  
}

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

首先此处需要一处重定向的代码,所以最后使用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

image

其中解析结果如图

image

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

image

漏洞修复

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

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

Ref

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

作者:【
Drunkbaby】