14-11
约 621 字大约 2 分钟
2025-11-02
Java invoke 反射具体利用
1. invoke 反射的基础
java.lang.reflect.Method 类的 invoke() 方法是反射的核心。它的签名如下:
public Object invoke(Object obj, Object... args)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetExceptionobj:要调用方法的对象实例。如果是静态方法,obj可以为nullargs:调用方法时传入的参数
利用方式:通过 invoke,你可以在不知道类名、方法名和参数类型的情况下,动态地调用任何方法。这正是它成为漏洞利用利器的原因
2. invoke 反射在反序列化中的利用
在 Java 反序列化漏洞中,invoke 反射通常用于构建 Gadget Chain,实现远程代码执行(RCE)
场景:Apache Commons Collections 反序列化漏洞
- 核心 Gadget:
InvokerTransformer。它的transform()方法正是利用了invoke反射 - 攻击链:
- 攻击者构造一个
ChainedTransformer,并将其与一系列Transformer组合 - 其中,最关键的
Transformer就是InvokerTransformer。攻击者会多次使用它来构建命令执行链 - 第一次
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()方法
- 第二次
invoke:Transformer实例:new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null})- 攻击者传入上一步返回的
Method对象作为obj,invoke方法会调用getRuntime().invoke(null, null) - 这会返回一个
Runtime实例
- 第三次
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 解析这个表达式时,它会执行以下步骤:
T():表达式引擎通过反射找到并获取java.lang.Runtime类对象getRuntime():表达式引擎调用java.lang.Runtime类的静态方法getRuntime()。这个过程在底层也是通过invoke反射实现的,传入null作为对象实例exec():表达式引擎调用上一步返回的Runtime实例的exec("whoami")方法
- 最终结果:成功执行系统命令