Java invoke 反射具体利用
1. invoke 反射的基础
java.lang.reflect.Method 类的 invoke() 方法是反射的核心。它的签名如下:
public Object invoke(Object obj, Object... args)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
obj:要调用方法的对象实例。如果是静态方法,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")方法最终结果:成功执行系统命令