Add files via upload

This commit is contained in:
雾島风起時
2025-09-25 03:55:13 +08:00
committed by GitHub
parent 6eda7b2da8
commit 2efe415c28
12 changed files with 430 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
### 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")` 方法
- **最终结果**:成功执行系统命令