Add files via upload
This commit is contained in:
@@ -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")` 方法
|
||||
- **最终结果**:成功执行系统命令
|
||||
Reference in New Issue
Block a user