漏洞公告
漏洞分析
这个漏洞本质上跟之前的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
使用漏洞版本的结果:
使用修复版本的结果:
Reference
https://spring.io/security/cve-2024-22259