漏洞详情
漏洞描述
当Spring-security使用 RegexRequestMatcher 进行权限配置,由于RegexRequestMatcher正则表达式配置权限的特性,正则表达式中包含“.”时,未经身份验证攻击者可以通过构造恶意数据包绕过身份认证。
影响版本:
Spring Security 5.5.x < 5.5.7
Spring Security 5.6.x < 5.6.4
漏洞原理
在访问/admin/{name}接口时,需要认证才能访问。当认证接口使用getRequestURI()或getRequestURL()函数来解析用户请求的URL时,若URL中包含了一些特殊符号,如分号;就可能产生限制绕过。而在spring-security中,存在StrictHttpfirewall机制默认对特殊字符进行过滤,所以使用/admin/..;/1这种方式也就无法绕过。
但是在正则表达式中元字符“.”是匹配除换行符(\n、\r)之外的任何单个字符,在java中的正则默认情况下“.”也同样不会包含\n、\r字符,所以RegexRequestMatcher在进行正则匹配时不会处理\n、\r
在spring-security中利用换行符可实现权限认证进行绕过,\r的URl编码为%0d,\n的URL编码为%0a
漏洞复现
靶场
1 | docker pull s0cke3t/cve-2022-22978:latest |
访问/admin/xxx会跳转至登陆页面进行权限验证。
漏洞产生的原因是由于正则发生了问题,可以通过在 URL 中加入换行符( r
或 n
)来绕过。(\r的url编码为%0d,\n的url编码为%0a)
使用/admin/%0dtest
或者 /admin/%0atest
成功绕过登陆认证。
流量分析
/admin/%0d
或者 /admin/%0a
是特征流量。
规则编写时,选择参数nocase
使用 nocase 关键字,规则编写者可以指定 Snort 应该查找特定的模式,而忽略大小写。nocase 修改规则中的上一个 content 关键字。
例子
1 | alert tcp any any -> any 21 (msg:"FTP ROOT"; content:"USER root"; nocase;) |