### CC1、CC6 区别

Commons Collections 1 (CC1) 利用链

CC1 是最经典、最广为人知的 Commons Collections 反序列化利用链。它利用了 `InvokerTransformer` 这个转换器来反射调用任意方法

利用链核心原理

CC1 利用链的核心思想是通过调用链，最终在反序列化过程中触发 `TemplatesImpl` 类的 `newTransformer` 方法，从而执行任意命令

1. `InvokerTransformer`：这是核心组件。它的 `transform()` 方法能够通过反射调用任意对象的任意方法。攻击者可以利用它来调用 `Runtime.getRuntime().exec()`
2. `InstantiateTransformer`：这个转换器用于实例化一个对象，其 `transform()` 方法会调用构造函数。在利用链中，它常用来实例化 `InvokerTransformer` 对象
3. `LazyMap`：这是一个延迟加载的 Map，它的 `get()` 方法会在键不存在时调用一个预设的转换器（Transformer）。攻击者可以将 `InvokerTransformer` 作为这个转换器，当对一个不存在的键进行 `get()` 操作时，就会触发 `InvokerTransformer` 的 `transform()` 方法
4. `AnnotationInvocationHandler` 或 `BadAttributeValueExpException`：CC1 利用链通常需要一个入口点，来触发 `LazyMap` 的 `get()` 方法。在旧版本的 JDK 中，`AnnotationInvocationHandler` 的 `readObject()` 方法会在反序列化时自动调用其内部的 `Proxy` 对象的 `invoke()` 方法，从而间接触发 `LazyMap` 的 `get()`。对于新版本的 JDK，由于对 `AnnotationInvocationHandler` 进行了限制，攻击者转而利用 `BadAttributeValueExpException` 的 `readObject()` 方法

Commons Collections 6 (CC6) 利用链

CC6 旨在解决 CC1 在较新版本的库和 JDK 中失效的问题。它抛弃了 CC1 中常用的 `InvokerTransformer`，转而利用 `TiedMapEntry` 和 `LinkedSet` 等新的类来构造利用链

利用链核心原理

CC6 的核心思想是利用 `TiedMapEntry` 在反序列化时触发 `Map` 的 `get()` 方法，最终同样达到命令执行的目的

1. `TiedMapEntry`：这是 CC6 利用链的核心。它的 `toString()` 方法在调用时会触发其内部 `Map` 的 `get()` 方法
2. `AbstractMap$TansformMapDecorator`：这是一个装饰器，它装饰了一个 Map，并用一个 `Transformer` 来处理其键值
3. `TransformedMap`：当向这个 Map 添加元素时，其 `put()` 方法会调用一个预设的 `Transformer`
4. `LinkedSet`：在 CC6 的利用中，攻击者通常会利用 `LinkedSet` 的 `equals()` 方法，该方法会遍历集合中的元素并调用它们的 `equals()`。通过精心构造 `LinkedSet`，可以使其内部的 `TiedMapEntry` 实例的 `toString()` 方法被调用
5. `InvokerTransformer` (再次出现)：尽管 CC6 旨在避开 `InvokerTransformer`，但在某些变体中，它仍然可以作为最终的命令执行器。不同的是，CC6 利用链的触发点不再是 CC1 中的 `LazyMap`

特性 | Commons Collections 1 (CC1) | Commons Collections 6 (CC6)
--- | --- | ---
核心触发器 | LazyMap 的 get() 方法 | TiedMapEntry 的 toString() 方法
主要攻击类 | InvokerTransformer, LazyMap, AnnotationInvocationHandler | TiedMapEntry, LinkedSet, TransformedMap
核心思想 | 通过 LazyMap 间接调用 InvokerTransformer | 通过 TiedMapEntry 的 toString() 调用 Map 的 get()
适用范围 | 较老的 Commons Collections 库版本，以及旧版 JDK | 较新的 Commons Collections 库版本，解决了 CC1 在新版本中的问题
链条复杂性 | 相对简单，逻辑直接 | 相对复杂，涉及更多的类和间接调用