Spring Security RegexRequestMatcher 认证绕过漏洞分析(CVE-2022-22978)

小黑黑  676天前

作者:h1ei1@白帽汇安全研究院

漏洞介绍

Spring Security 是 Spring 家族中的一个安全管理框架。在 Spring Security 正则表达式中使用带有 . 的 RegexRequestMatcher 的应用程序可能容易受到授权绕过。影响版本如下:

5.5.7 之前的 5.5.x5.6.4 之前的 5.6.x早期不支持的版本

漏洞分析

参考官方公告我们可以在github上diff看看https://github.com/spring-projects/spring-security/compare/5.6.3...5.6.4,可以看到相关的commit

1.png

Pattern 类是 java.util.regex 包的三个类之一,负责处理正则表达式相关

Pattern.DOTALL:表示更改.的含义,使它与每一个字符匹配(包括换行符\n),默认情况下, 正则表达式中点(.)不会匹配换行符, 设置了Pattern.DOTALL模式, 才会匹配所有字符包括换行符。

Pattern.CASE_INSENSITIVE:忽略大小写。

可以看到RegexRequestMatcher.java文件的修复是增加了对换行符的匹配以及忽略大小写。而且下边的RegexRequestMatchertests.java文件也给了绕过的提示(\r的URl编码为%0d,\n的URL编码为%0a)。

2.png

漏洞复现

我们新建一个spring boot 项目在pom.xml中加入Spring Security

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

指定5.6.3版本来覆盖默认的版本

<properties>
  <spring-security.version>5.6.3</spring-security.version>
</properties>

项目创建完成后,我们新建一个Controller接口

3.png

然后我们再添加一个简单的认证配置:

http.authorizeRequests():主要是对url进行访问权限控制,通过这个方法来实现url授权操作。

authenticated():是访问控制方法的一种,表示所匹配的URL都需要被认证才能访问

4.png

然后此时的/admin/*接口是需要认证才能访问

5.png

使用%0a或者%0d成功绕过

6.png

参考

https://tanzu.vmware.com/security/cve-2022-22978

https://mp.weixin.qq.com/s?__biz=Mzg3MTU0MjkwNw==&mid=2247490023&idx=1&sn=f7e654f69ceca1ff437d9431bdd8ffa7&chksm=cefda0f3f98a29e5556a31b28ba231613e49b0ff40fcee651fac351adc6376e2ad2b72509dbf&mpshare=1&scene=23&srcid=0521HdxkxW0hzTIKsAqAfCoK&sharer_sharetime=1653211841788&sharer_shareid=4ab8b98c0a9c5866b3e90483ff7445f3#rd

https://blog.csdn.net/qq_41865652/article/details/123685248


本文为白帽汇原创文章,如需转载请注明来源:https://nosec.org/home/detail/5006.html

最新评论

昵称
邮箱
提交评论