Java invoke 反射具体利用

1. invoke 反射的基础

java.lang.reflect.Method 类的 invoke() 方法是反射的核心。它的签名如下:

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 反序列化漏洞

  • 核心 GadgetInvokerTransformer。它的 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 类作为 objinvoke 方法会调用 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 对象作为 objinvoke 方法会调用 getRuntime().invoke(null, null)
      • 这会返回一个 Runtime 实例
    5. 第三次 invoke
      • Transformer 实例:new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"whoami"})
      • 攻击者传入上一步返回的 Runtime 实例作为 objinvoke 方法会调用 runtime.exec("whoami")
  • 最终结果:通过三次 invoke 反射的串联,实现了从获取 Runtime 实例到执行系统命令的完整攻击过程

3. invoke 反射在表达式注入中的利用

在表达式语言(如 SpEL、OGNL)注入漏洞中,invoke 反射是实现 RCE 的主要手段

场景:Spring SpEL 注入

  • 攻击 PayloadT(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") 方法
  • 最终结果:成功执行系统命令
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:12:55

results matching ""

    No results matching ""