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漏洞:绕过服务端对目标地址的限制
漏洞复现与分析
漏洞环境搭建
示例漏洞控制器代码:
@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
解析过程:
- 原始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攻击。开发者应及时升级到修复版本,并在代码中实施严格的安全验证措施。