Spring-security RegexRequestMatcher认证绕过漏洞
一、漏洞简介
当Spring-security使用 RegexRequestMatcher 进行权限配置,由RegexRequestMatcher正则表达式配置权限的特性,正则表达式中包含“.”时,未经身份验证攻击者可以通过构造恶意数据包绕过身份认证。
二、影响版本
Spring Security 5.5.x < 5.5.7
Spring Security 5.6.x < 5.6.4
三、漏洞复现
1、环境搭建
这里我们搭建环境使用Github上一位大佬搭建的漏洞环境,链接如下
https://github.com/XuCcc/VulEnv/tree/master/springboot/cve_2022_22978
将项目下载下来之后,编译之后在idae直接启动即可,启动之后页面如下
2、观察环境
该项目自定义了两个接口,并且引入了Springsecurity,所以这里自定义的/admin/{name}接口就需要认证
再来回忆下刚才介绍Springsecurity这个漏洞时介绍的两个条件
SpringSecurity版本符合要求
- Spring Security 5.5.x < 5.5.7
- Spring Security 5.6.x < 5.6.4
使用了RegexRequestMatcher正则表达式配置权限,并且正则表达式中包含”.”
我们下面就来看看这个项目是否符合这两个条件,是否存在该漏洞
首先这是Spring-security的漏洞,所以我们自然要先看看该项目导入的Springsecurity版本,如下
可以看到这里的Springsecurity的版本是5.6.3,符合上面的漏洞版本Spring Security 5.6.x < 5.6.4,所以漏洞的版本前置条件已经达成了
通过检索发现该项目确实使用了RegexMatcher正则表达式,并且正则表达式中包含”.”,初步判断存在该漏洞
3、漏洞实操
我们访问127.0.0.1:8080/admin/cyx,自动重定向到127.0.0.1:8080/login这个默认登录页面。如下
即认证生效,此时在/admin/cyx末尾加上如下字符其中一种
- \r的URl编码为%0d
- \n的URL编码为%0a
即两种换行符,此时结果如下
成功绕过Springsecurity的身份认证,访问到了受保护的资源
四、漏洞分析
在正则表达式中元字符“.”是匹配除换行符(\n、\r)之外的任何单个字符,在java中的正则默认情况下“.”也同样不会包含\n、\r字符,所以RegexRequestMatcher在进行正则匹配时不会处理\n、\r,如下
如果目标站点的正则判断规则如下
regexMatchers("/admin/.*")
此时键入如下路径
127.0.0.1:8080/admin/cyx%0d
或
127.0.0.1:8080/admin/cyx%0a
就不会个/admin/.*这个正则匹配成功,就不会被重定向到登录界面,从而访问到了受保护的/admin下的资源,如下
五、修复手段
在Springsecurity的新版本,将原先正则选择的默认匹配模式换为了DOTALL模式,此时的”.”就不会跳出判断规则从而导致绕过了
到这里本次漏洞分析就结束了,基于这个特性,Shiro也有对应的漏洞,我们后面也会对应的分析一次,理解他们的共性