### Java invoke 反射具体利用

1. `invoke` 反射的基础

`java.lang.reflect.Method` 类的 `invoke()` 方法是反射的核心。它的签名如下：

    public Object invoke(Object obj, Object... args)
        throws IllegalAccessException, IllegalArgumentException, InvocationTargetException

- `obj`：要调用方法的对象实例。如果是静态方法，`obj` 可以为 `null`
- `args`：调用方法时传入的参数

利用方式：通过 `invoke`，你可以在不知道类名、方法名和参数类型的情况下，动态地调用任何方法。这正是它成为漏洞利用利器的原因

2. `invoke` 反射在反序列化中的利用

在 Java 反序列化漏洞中，`invoke` 反射通常用于构建 Gadget Chain，实现远程代码执行（RCE）

场景：`Apache Commons Collections` 反序列化漏洞

- 核心 Gadget：`InvokerTransformer`。它的 `transform()` 方法正是利用了 `invoke` 反射
- 攻击链：
  1. 攻击者构造一个 `ChainedTransformer`，并将其与一系列 `Transformer` 组合
  2. 其中，最关键的 `Transformer` 就是 `InvokerTransformer`。攻击者会多次使用它来构建命令执行链
  3. 第一次 `invoke`：
     - `Transformer` 实例：`new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null})`
     - 攻击者传入 `java.lang.Runtime` 类作为 `obj`，`invoke` 方法会调用 `java.lang.Runtime.class.getMethod("getRuntime")`
     - 这会返回一个 `Method` 对象，指向 `getRuntime()` 方法
  4. 第二次 `invoke`：
     - `Transformer` 实例：`new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null})`
     - 攻击者传入上一步返回的 `Method` 对象作为 `obj`，`invoke` 方法会调用 `getRuntime().invoke(null, null)`
     - 这会返回一个 `Runtime` 实例
  5. 第三次 `invoke`：
     - `Transformer` 实例：`new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"whoami"})`
     - 攻击者传入上一步返回的 `Runtime` 实例作为 `obj`，`invoke` 方法会调用 `runtime.exec("whoami")`
- 最终结果：通过三次 `invoke` 反射的串联，实现了从获取 `Runtime` 实例到执行系统命令的完整攻击过程

3. `invoke` 反射在表达式注入中的利用

在表达式语言（如 SpEL、OGNL）注入漏洞中，`invoke` 反射是实现 RCE 的主要手段

场景：Spring SpEL 注入

- 攻击 Payload：`T(java.lang.Runtime).getRuntime().exec("whoami")`
- 攻击链：当 Spring 解析这个表达式时，它会执行以下步骤：
  1. `T()`：表达式引擎通过反射找到并获取 `java.lang.Runtime` 类对象
  2. `getRuntime()`：表达式引擎调用 `java.lang.Runtime` 类的静态方法 `getRuntime()`。这个过程在底层也是通过 `invoke` 反射实现的，传入 `null` 作为对象实例
  3. `exec()`：表达式引擎调用上一步返回的 `Runtime` 实例的 `exec("whoami")` 方法
- 最终结果：成功执行系统命令