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 的输入,以此类推
  • 如何触发命令执行:攻击者会将一个完整的攻击链(通常是 ConstantTransformerInvokerTransformer 的组合)封装到一个 ChainedTransformer 中。当 ChainedTransformer 被反序列化时,它会按顺序调用这些 Transformer,最终触发命令执行
  • 用途ChainedTransformer 是所有 CommonsCollections 利用链的核心驱动器。它扮演着“执行引擎”的角色,将整个多米诺骨牌串联起来,确保它们能按正确的顺序倒下
Transformer 功能 在攻击链中的作用
InvokerTransformer 反射调用方法 执行命令,是攻击链的核心
InstantiateTransformer 实例化对象 创建实例,通常用于创建 Runtime 实例
ConstantTransformer 返回常量值 提供常量对象,通常用于提供 Runtime 实例
ChainedTransformer 串联多个Transformer 驱动整个攻击链,按顺序执行每个 Transformer
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:12:55

results matching ""

    No results matching ""