### CC 链四个 Transformer 区别

1. `InvokerTransformer`

`InvokerTransformer` 是最核心、最通用、也最经典的 `Transformer`

- 原理：它通过 Java 反射来调用一个对象的方法。在它的 `transform()` 方法中，你可以指定一个类名、方法名和方法参数。`InvokerTransformer` 会反射调用你指定的方法，并返回结果
- 如何触发命令执行：
  1. 指定类为 `java.lang.Runtime`
  2. 指定方法为 `getMethod("getRuntime")`
  3. 指定参数为空
  4. 这会返回 `Runtime` 的实例
  5. 然后，再用另一个 `InvokerTransformer` 来调用 `exec()` 方法执行命令
- 用途：它是 `CommonsCollections1` 利用链的核心组件。由于其功能过于强大和通用，它也是第一个被安全防御工具（如黑名单）重点关注和拦截的类。

2. `InstantiateTransformer`

`InstantiateTransformer` 的功能是实例化一个新对象

- 原理：它的 `transform()` 方法会根据你指定的类名，通过反射来调用其构造函数，从而创建一个新的对象实例
- 如何触发命令执行：
  1. 指定类为 `java.lang.Runtime`
  2. 指定构造函数为 `getConstructor()`
  3. 这会创建一个 `Runtime` 的实例
  4. 然后，再用 `InvokerTransformer` 来调用 `exec()` 方法
- 用途：它通常用于在没有 `Runtime` 实例的情况下，创建一个新的 `Runtime` 实例。它在某些特定的 Gadget Chain 中用于绕过对 `InvokerTransformer` 的直接调用

3. `ConstantTransformer`

`ConstantTransformer` 是一个非常简单的 `Transformer`

- 原理：它的 `transform()` 方法会直接返回一个你预先设置好的常量，而不进行任何额外的操作
- 如何触发命令执行：它本身不能直接执行命令。它通常作为 Gadget Chain 中的辅助组件，用来提供一个常量值，比如提供一个 `Runtime` 实例
  1. 创建 `ConstantTransformer`，并传入 `Runtime.getRuntime()` 的实例
  2. 当 `transform()` 方法被调用时，它会返回这个 `Runtime` 实例
- 用途：它常被用于组合其他 `Transformer`，为攻击链提供必要的对象实例。例如，在 `CommonsCollections4` 利用链中，它被用来提供 `Runtime` 实例，然后由 `InvokerTransformer` 来调用 `exec()`

4. `ChainedTransformer`

`ChainedTransformer` 的功能是将多个 `Transformer` 串联起来

- 原理：它的 `transform()` 方法会按顺序调用一个 `Transformer` 数组中的每一个 `Transformer`。第一个 `Transformer` 的输出会作为第二个 `Transformer` 的输入，以此类推
- 如何触发命令执行：攻击者会将一个完整的攻击链（通常是 `ConstantTransformer` 和 `InvokerTransformer` 的组合）封装到一个 `ChainedTransformer` 中。当 `ChainedTransformer` 被反序列化时，它会按顺序调用这些 `Transformer`，最终触发命令执行
- 用途：`ChainedTransformer` 是所有 `CommonsCollections` 利用链的核心驱动器。它扮演着“执行引擎”的角色，将整个多米诺骨牌串联起来，确保它们能按正确的顺序倒下

Transformer | 功能 | 在攻击链中的作用
--- | --- | ---
InvokerTransformer | 反射调用方法 | 执行命令，是攻击链的核心
InstantiateTransformer | 实例化对象 | 创建实例，通常用于创建 Runtime 实例
ConstantTransformer | 返回常量值 | 提供常量对象，通常用于提供 Runtime 实例
ChainedTransformer | 串联多个Transformer | 驱动整个攻击链，按顺序执行每个 Transformer