### 讲一下 CC1-7 的原理

CC1: `InvokerTransformer`

- 原理：这是最经典、最著名的利用链。它利用了 `InvokerTransformer` 这个类，它的 `transform` 方法可以通过反射调用任何对象的任何方法
- 攻击链：
  1. `LazyMap`：它是一个惰性加载的 Map，当访问一个不存在的键时，会调用一个 `Transformer` 来生成值
  2. `InvokerTransformer`：攻击者将 `InvokerTransformer` 封装到 `LazyMap` 中，并指定其调用 `Runtime.getRuntime().exec()` 方法
  3. `AnnotationInvocationHandler`：当 `LazyMap` 被反序列化时，`AnnotationInvocationHandler` 会调用它的 `invoke` 方法，从而触发 `LazyMap` 的 `get` 方法
  4. `Runtime.exec()`：最终，`LazyMap` 的 `get` 方法会调用 `InvokerTransformer`，通过反射执行 `Runtime.exec()`，从而执行任意命令
- 绕过：由于 `InvokerTransformer` 过于危险，它很快被许多安全框架和应用服务器加入了反序列化黑名单

CC2-CC7：黑名单绕过与新 Gadget Chain 的发现

在 CC1 被加入黑名单后，研究人员开始寻找新的、没有被列入黑名单的 Gadget Chain。这些新的利用链都遵循同样的原理，只是利用了不同的类来构建多米诺骨牌

- CC2 (`j_object`)：利用 `Spring` 框架中的 `Javassist` 类库。它通过 `ClassPathXmlApplicationContext` 加载一个远程 XML 文件，从而执行远程代码
- CC3 (`j_object`)：利用 `AbstractMap` 的 `hashCode` 方法，通过 `equals` 方法来触发 `InvokerTransformer`
- CC4 (`j_object`)：利用 `Spring` 的 `BadAttributeValueExpException` 类。当这个类被反序列化时，它的 `toString` 方法会被调用，从而触发 `InvokerTransformer`
- CC5 (`j_object`)：这个利用链与 CC1 类似，但它通过 `TiedMapEntry` 来触发 `LazyMap`，从而绕过了一些针对 `AnnotationInvocationHandler` 的防御
- CC6 (`j_object`)：这个利用链也使用了 `TiedMapEntry`，但它通过 `TiedMapEntry` 的 `toString` 方法来触发 `LazyMap`
- CC7 (`j_object`)：这个利用链使用 `HashedMap` 的 `readObject` 方法来触发 `AbstractMap` 的 `put` 方法，最终触发 `InvokerTransformer`