Spring Security RegexRequestMatcher 认证绕过漏洞分析(CVE-2022-22978)
作者: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。
Pattern
类是 java.util.regex
包的三个类之一,负责处理正则表达式相关
Pattern.DOTALL
:表示更改.的含义,使它与每一个字符匹配(包括换行符\n),默认情况下, 正则表达式中点(.)不会匹配换行符, 设置了Pattern.DOTALL
模式, 才会匹配所有字符包括换行符。
Pattern.CASE_INSENSITIVE
:忽略大小写。
可以看到RegexRequestMatcher.java
文件的修复是增加了对换行符的匹配以及忽略大小写。而且下边的RegexRequestMatchertests.java
文件也给了绕过的提示(\r的URl编码为%0d,\n的URL编码为%0a)。
漏洞复现
我们新建一个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接口
然后我们再添加一个简单的认证配置:
http.authorizeRequests()
:主要是对url进行访问权限控制,通过这个方法来实现url授权操作。
authenticated()
:是访问控制方法的一种,表示所匹配的URL都需要被认证才能访问
然后此时的/admin/*接口是需要认证才能访问
使用%0a或者%0d成功绕过
参考
https://tanzu.vmware.com/security/cve-2022-22978
https://blog.csdn.net/qq_41865652/article/details/123685248
本文为白帽汇原创文章,如需转载请注明来源:https://nosec.org/home/detail/5006.html
最新评论