漏洞详情

漏洞描述

当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

漏洞复现

靶场

docker pull s0cke3t/cve-2022-22978:latest
docker run -d -p 8080:8080 s0cke3t/cve-2022-22978:latest

访问/admin/xxx会跳转至登陆页面进行权限验证。

漏洞产生的原因是由于正则发生了问题,可以通过在 URL 中加入换行符( rn )来绕过。(\r的url编码为%0d,\n的url编码为%0a)

使用/admin/%0dtest 或者 /admin/%0atest成功绕过登陆认证。

流量分析

/admin/%0d 或者 /admin/%0a 是特征流量。

规则编写时,选择参数nocase

使用 nocase 关键字,规则编写者可以指定 Snort 应该查找特定的模式,而忽略大小写。nocase 修改规则中的上一个 content 关键字。

例子

alert tcp any any -> any 21 (msg:"FTP ROOT"; content:"USER root"; nocase;)

评论