CVE-2022-22978 SpringSecurity权限绕过
简介
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-22978
从上面的漏洞通告得知,SpringSecurity组件中RegexRequestMatcher组件存在权限绕过问题且漏洞组件版本存在于5.5.6 和 5.6.3 以及不受支持的旧版本中
环境搭建
pom相关依赖即指定springsecurity为漏洞版本
|
|
添加相关controller
|
|
使用RegexRequestMatcher对访问请求进行拦截
|
|
分析
存在漏洞版本的SpringSecurity组件版本中将给定的正则表达式编译为带有给定标志的模式设置为default
查看相关文档,共有如下标志位
-
CASE_INSENSITIVE
-
1public static final int CASE_INSENSITIVE启用不区分大小写的匹配。默认情况下,不区分大小写的匹配假定仅匹配US-ASCII字符集中的字符。 可以通过与此标志一起指定UNICODE_CASE``标志来启用Unicode感知不区分大小写的匹配。
也可以通过嵌入式标志表达式(?i)启用不区分大小写的匹配。
指定此标志可能会造成轻微的性能损失。
-
-
COMMENTS
-
1public static final int COMMENTS允许空格和注释格式。在此模式下,将忽略空格,并且以#开头的嵌入式注释将被忽略,直到行尾。
注释模式也可以通过嵌入式标志表达式(?x)启用 。
-
-
MULTILINE
-
1public static final int MULTILINE启用多行模式。在多行模式下,表达式^和$分别匹配行终止符或输入序列的结尾。 默认情况下,这些表达式仅在整个输入序列的开头和结尾匹配。
也可以通过嵌入式标志表达式(?m)启用多模式模式。
-
-
LITERAL
-
1public static final int LITERAL启用模式的文字解析。当指定此标志时,指定模式的输入字符串将被视为文字字符序列。 输入序列中的元字符或转义序列将没有特殊的含义。
CASE_INSENSITIVE和UNICODE_CASE标志在与此标志一起使用时保持对匹配的影响。 其他旗帜变得多余。
没有嵌入的标志字符用于启用文字解析。
从以下版本开始:1.5
-
-
DOTALL
-
1public static final int DOTALL启用点阵模式。在dotall模式下,表达式.匹配任何字符,包括行终止符。 默认情况下,此表达式与行终止符不匹配。
Dotall模式也可以通过嵌入式标志表达式(?s)启用 。 ( s是“单行”模式的助记符,这在Perl中被称为)。
-
-
UNICODE_CASE
-
1public static final int UNICODE_CASE启用Unicode感知案例折叠。当指定此标志时,不区分大小写的匹配(由CASE_INSENSITIVE``标志启用)以与Unicode标准一致的方式完成。 默认情况下,不区分大小写的匹配假定仅匹配US-ASCII字符集中的字符。
Unicode感知案例折叠也可以通过嵌入式标志表达式(?u)启用 。
指定此标志可能会造成性能损失。
-
-
CANON_EQ
-
1public static final int CANON_EQ实现规范等价。当指定这个标志时,两个字符将被认为是匹配的,只有当他们的完整的规范分解符合时才匹配。 表达"a\u030A",例如,将指定该标志时,该字符串"\u00E5"匹配。 默认情况下,匹配不考虑规范等价。
没有嵌入的标志字符用于启用规范等效。
指定此标志可能会造成性能损失。
-
-
UNICODE_CHARACTER_CLASS
-
1public static final int UNICODE_CHARACTER_CLASS启用Unicode版本的预定义字符类和POSIX字符类 。当指定此标志时,(仅US-ASCII) 预定义字符类和POSIX字符类符合*Unicode Technical Standard #18: Unicode Regular Expression* 附件C:兼容性属性 。
也可以通过嵌入式标志表达式(?U)启用UNICODE_CHARACTER_CLASS模式。
该标志意味着UNICODE_CASE,也就是说,它可以支持Unicode感知案例折叠。
指定此标志可能会造成性能损失。
从以下版本开始:1.7
-
当使用默认匹配模式且存在 . 匹配符时,可以通过\n \r 对匹配内容进行绕过
注:正则中.匹配除 \n \r之外的单个字符
场景换为开启的web服务,没权限的情况下访问会被拦截
通过\r \n 成功绕过拦截
修复
官方补丁如下
https://github.com/spring-projects/spring-security/compare/5.6.3...5.6.4
将默认匹配模式指定为DOTALL(匹配任何字符),本地指定DOTALL模式对含\n \r的payload成功匹配,即无法绕过