【漏洞分析】CVE-2024-22259: Spring Framework URL Parsing with Host Validation (2nd report)

漏洞公告

漏洞分析

这个漏洞本质上跟之前的CVE-2024-22243是同一个问题,且之前官方修复的不完全,导致还是可以被绕过。
这一点,官方在公告里也提到了。

补丁diff下,能看到其实还是url解析的那个正则表达式的修改:

//5.3.31的正则:
^(([^:/?#]+):)?(//(([^@/?#]*)@)?(\[[\p{XDigit}:.]*[%\p{Alnum}]*]|[^\[/?#:]*)(:(\{[^}]+\}?|[^/?#]*))?)?([^?#]*)(\?([^#]*))?(#(.*))?

//5.3.32的正则:
^(([^:/?#]+):)?(//(([^/?#]*)@)?(\[[\p{XDigit}:.]*[%\p{Alnum}]*]|[^/?#:]*)(:(\{[^}]+\}?|[^/?#]*))?)?([^?#]*)(\?([^#]*))?(#(.*))?

可以看到,有两处区别:

  • 第一处是提取userInfo的部分,一个字符@的区别:
    在第一个正则中,[^@/?#]*匹配除了@, /, ?, #之外的任何字符;
    而在第二个正则中,[^/?#]*匹配除了/, ?, #以外的任何字符。
  • 第二处是提取host的部分,一个字符[的区别:
    在第一个正则中,(\[[\p{XDigit}:.]*[%\p{Alnum}]*]|[^\[/?#:]*):这部分匹配主机名,可以是IPv6地址(在方括号内,可以包含十六进制数字、冒号、点和百分号编码),或者是普通的主机名(不包含[, /, ?, #, :的任何字符);
    而在第二个正则中,(\[[\p{XDigit}:.]*[%\p{Alnum}]*]|[^/?#:]*): 这部分用于匹配主机名,支持IPv6地址(位于方括号中,包含十六进制数字、冒号、点和百分号编码的组合)或普通主机名(不包含/, ?, #, :的任何字符)。

其实重点还是host解析的部分,使用漏洞版本时,当提取host时,如果遇到[,就不会继续往后提取。

因此可构造url如下:

https://mole.sh@mole.sh[evil.com
//或者简单点的:
https://mole.sh[evil.com

使用漏洞版本的结果:
image

image

使用修复版本的结果:
image

image

Reference

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

posted @ 2025-02-21 21:11  wh03ver-momo  阅读(132)  评论(0)    收藏  举报