JeecgBoot小于3.6.0版本存在SQL注入漏洞
字数 1205 2025-08-20 18:17:58
JeecgBoot SQL注入漏洞分析与防护指南
漏洞概述
JeecgBoot框架在3.6.0以下版本中存在一个严重的SQL注入漏洞,位于/sys/api/queryFilterTableDictInfo接口。攻击者可以利用此漏洞直接查询数据库中的任意表数据,导致敏感信息泄露。
漏洞详情
漏洞接口
/sys/api/queryFilterTableDictInfo
漏洞参数
table: 指定要查询的表名text: 指定要查询的字段名(作为显示文本)code: 指定要查询的字段名(作为值)filterSql: 过滤条件(可选)pageSize: 每页记录数pageNo: 页码
漏洞原理
前端用户可控参数table、text和code未经充分过滤直接拼接到SQL查询中,导致攻击者可以构造恶意参数查询任意表数据。
漏洞复现步骤
-
获取有效Token:
- 首先需要获取一个有效的用户认证Token(通过正常登录或其他方式)
-
构造恶意请求:
GET /jeecg-boot/sys/api/queryFilterTableDictInfo?table=sys_user&text=username&code=password&filterSql=&pageSize=1000&pageNo=1携带有效Token访问上述URL
-
结果分析:
- 成功响应将返回
sys_user表中的所有用户名和密码 - 通过修改
table参数可以查询其他表数据 - 错误响应可能暴露数据库结构信息(如库名
onenext_init)
- 成功响应将返回
漏洞影响
-
数据泄露:
- 可以获取用户凭证(用户名和密码)
- 可以查询业务敏感数据(如示例中的
tax_task表) - 可以获取数据库元信息
-
系统危害:
- 完全数据库信息泄露
- 可能导致进一步权限提升
- 可能引发数据篡改风险
漏洞利用前提
- 获取有效的用户Token
- 目标系统使用JeecgBoot 3.6.0以下版本
- 漏洞接口未被禁用或加固
修复建议
临时缓解措施
-
禁用漏洞接口:
- 在应用层禁用
/sys/api/queryFilterTableDictInfo接口的访问
- 在应用层禁用
-
访问控制:
- 对接口增加严格的权限控制
- 限制可查询的表和字段范围
长期解决方案
-
升级框架:
- 升级到JeecgBoot 3.6.0或更高版本
-
参数过滤:
- 实现白名单机制,只允许特定的表和字段名
- 对用户输入进行严格的过滤和转义
-
使用预编译语句:
- 使用参数化查询或ORM框架,避免直接拼接SQL
-
错误处理:
- 自定义错误信息,避免暴露数据库结构
代码层面修复
// 示例修复代码(伪代码)
public Result queryFilterTableDictInfo(
@RequestParam String table,
@RequestParam String text,
@RequestParam String code,
HttpServletRequest request) {
// 1. 表名白名单校验
if(!isAllowedTable(table)) {
return Result.error("非法表名");
}
// 2. 字段名白名单校验
if(!isAllowedColumn(text) || !isAllowedColumn(code)) {
return Result.error("非法字段名");
}
// 3. 使用参数化查询
String sql = "SELECT " + text + ", " + code + " FROM " + table;
if(StringUtils.isNotBlank(filterSql)) {
// 对filterSql进行严格过滤
sql += " WHERE " + filterSql;
}
// 使用预编译语句执行查询
// ...
}
安全防护最佳实践
-
最小权限原则:
- 数据库连接使用最小必要权限账户
-
输入验证:
- 对所有用户输入进行严格验证
-
输出编码:
- 对输出到前端的数据进行编码处理
-
安全审计:
- 定期进行代码安全审计
- 使用自动化工具扫描漏洞
-
日志监控:
- 记录可疑的数据库查询行为
- 设置异常操作告警
总结
该SQL注入漏洞危害严重,可导致系统敏感数据完全泄露。建议所有使用JeecgBoot框架的用户立即检查版本并采取相应防护措施。对于无法立即升级的系统,应至少实施临时缓解方案,并尽快安排升级计划。