Files
2025-09-25 03:55:13 +08:00

51 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### Java invoke 反射具体利用
**1. `invoke` 反射的基础**
`java.lang.reflect.Method` 类的 `invoke()` 方法是反射的核心。它的签名如下:
```java
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")` 方法
- **最终结果**:成功执行系统命令