漏洞描述
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
[^@\[/?#]*
: 表示匹配除了特定字符@
,[
,/
,?
,#
之外的任意字符零次或多次。
-
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
其中解析结果如图
这样一来就可以绕过白名单的检测了,随后通过@
符号发起 SSRF
漏洞修复
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 解析不当漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论