一、漏洞简介

当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直接启动即可,启动之后页面如下

img

2、观察环境

该项目自定义了两个接口,并且引入了Springsecurity,所以这里自定义的/admin/{name}接口就需要认证

img

再来回忆下刚才介绍Springsecurity这个漏洞时介绍的两个条件

  • SpringSecurity版本符合要求

    • Spring Security 5.5.x < 5.5.7
    • Spring Security 5.6.x < 5.6.4
  • 使用了RegexRequestMatcher正则表达式配置权限,并且正则表达式中包含”.”

我们下面就来看看这个项目是否符合这两个条件,是否存在该漏洞

首先这是Spring-security的漏洞,所以我们自然要先看看该项目导入的Springsecurity版本,如下

img

可以看到这里的Springsecurity的版本是5.6.3,符合上面的漏洞版本Spring Security 5.6.x < 5.6.4,所以漏洞的版本前置条件已经达成了

img

通过检索发现该项目确实使用了RegexMatcher正则表达式,并且正则表达式中包含”.”,初步判断存在该漏洞

3、漏洞实操

我们访问127.0.0.1:8080/admin/cyx,自动重定向到127.0.0.1:8080/login这个默认登录页面。如下

img

即认证生效,此时在/admin/cyx末尾加上如下字符其中一种

  • \r的URl编码为%0d
  • \n的URL编码为%0a

即两种换行符,此时结果如下

img

成功绕过Springsecurity的身份认证,访问到了受保护的资源

四、漏洞分析

在正则表达式中元字符“.”是匹配除换行符(\n、\r)之外的任何单个字符,在java中的正则默认情况下“.”也同样不会包含\n、\r字符,所以RegexRequestMatcher在进行正则匹配时不会处理\n、\r,如下

img

如果目标站点的正则判断规则如下

regexMatchers("/admin/.*")

此时键入如下路径

127.0.0.1:8080/admin/cyx%0d

127.0.0.1:8080/admin/cyx%0a

就不会个/admin/.*这个正则匹配成功,就不会被重定向到登录界面,从而访问到了受保护的/admin下的资源,如下

img

五、修复手段

在Springsecurity的新版本,将原先正则选择的默认匹配模式换为了DOTALL模式,此时的”.”就不会跳出判断规则从而导致绕过了

到这里本次漏洞分析就结束了,基于这个特性,Shiro也有对应的漏洞,我们后面也会对应的分析一次,理解他们的共性