作者:Sean Pesce
该项目包含一个示例 Web 应用,用于演示以下漏洞的可利用场景: CVE-2024-22243, 这是 Java Spring Framework 中的一个 URL 解析漏洞 (官方披露见此处)。
受影响版本的 Spring 会以独特方式解析 URL 中的 “userinfo”段, 这可能导致提取出的主机名段与许多 其他常见库不同。
该异常行为源于以下正则表达式(regex),它位于
UriComponentsBuilder
类中(由
此提交
于 2014 年引入):
private static final String USERINFO_PATTERN = "([^@\\[/?#]*)";
该正则表达式不允许用户信息段中出现“左方括号”字符([)。然而,
Spring 在这种行为上似乎是一个特例,因此对
UriComponents
对象调用 getHost()(该对象使用
UriComponentsBuilder.fromUriString
或
UriComponentsBuilder.fromHttpUrl
构造)可能会产生意外行为。
RestTemplate、
RestClient
和 WebClient
类由于在内部使用了 UriComponentsBuilder 而同样受到影响;因此,
即使不直接使用 UriComponentsBuilder,相关实现也可能存在漏洞。
对于特制输入,Spring 返回的主机名值将与以下所有项的 结果不同:
java.net.URI(据称仅适用于特定 Java 版本;其他版本会抛出 URISyntaxException)java.net.URLcurlandroid.net.Uriokhttp3.HttpUrlurllib.parse.urlparse(请注意,此列表并不详尽。)
这种异常行为可能使基于 Spring 的 Web 应用容易受到 开放重定向和 服务端请求伪造(SSRF)的影响,前提是 相关实现使用可信主机名进行授权或其他安全相关 机制。
该示例 Web 应用包含两个存在漏洞的端点。
第一个端点 /redirect 展示了 Spring 异常的 URL 解析如何导致开放
重定向。可以使用如下 URL 进行利用:
https://127.0.0.1[@evil.com
第二个端点 /health-check 演示了 Spring 与
Java 标准库 URL 类之间的 URL 解析差异如何导致服务端请求伪造(SSRF)。可以使用
如下 URL 进行利用:
https://evil.com[@127.0.0.1
要使用 Maven 构建此项目,只需运行以下命令(已在 OpenJDK 17 上测试):
mvn clean package
然后,使用类似以下命令启动 Web 应用:
java -jar seanpesce-cve-2024-22243.jar 9999
Web 应用将可通过 http://127.0.0.1:9999/ 访问。
要构建 docker 镜像,请运行以下命令:
docker build -t seanpesce-cve-2024-22243:latest .
然后,使用类似以下命令启动 Web 应用:
docker run -i -e PORT=9999 -p 9999:9999 seanpesce-cve-2024-22243:latest
在 Docker 主机上,Web 应用将可通过 http://127.0.0.1:9999/ 访问。
本仓库还包含 semgrep 规则,用于辅助扫描
可能存在漏洞的代码路径。spring-cve-2024-22243_loose.yaml
会对受漏洞影响的 API 的任何使用进行朴素扫描;因此,它通常会返回大量
误报。spring-cve-2024-22243_strict.yaml
尝试使用更严格的逻辑和污点分析;但该方法尚未经过
全面测试,并且极有可能漏掉某些存在漏洞的实现(尤其是在未使用
Semgrep Pro 时,跨文件分析需要 Semgrep Pro)。