代码审计之实战中各类SQL注入漏洞代码分析及其成因分析(以jeecgboot3.5.3为例)
字数 1834 2025-08-29 22:41:01
JEECGBOOT 3.5.3 SQL注入漏洞分析与教学
概述
本文档详细分析JEECGBOOT 3.5.3版本中存在的多种SQL注入漏洞,包括布尔盲注、时间盲注和普通用户越权查询漏洞。通过代码审计的方式,深入剖析漏洞成因、利用方式及修复方案。
1. JinmuReport未授权SQL注入(布尔盲注)
漏洞位置
- 接口路径:
/jeecg-boot/jmreport/show - 相关类:
org.jeecg.modules.jmreport.desreport.a.a - 服务实现类:
org.jeecg.modules.jmreport.desreport.service.a.e
漏洞分析
-
漏洞触发流程:
show方法接收JSON数据中的id和params参数- 参数传递到
jmReportDesignService.show进行查询 - 最终执行
getDbSql方法进行SQL查询
-
过滤机制缺陷:
- 过滤方法:
i.a - 黑名单内容:
" exec |peformance_schema|information_schema|extractvalue|updatexml|geohash|gtid_subset|gtid_subtract| insert | alter | delete | grant | update | drop | chr | mid | master | truncate | char | declare |user()|" - 缺失过滤的关键词:
ascii,having等
- 过滤方法:
-
未授权访问:
- 该路由未进行身份验证
- 无需登录和token即可直接访问
漏洞利用
由于黑名单过滤不完全,攻击者可构造包含ascii或having等关键字的SQL语句实现布尔盲注。
修复方案
升级积木报表版本,补全黑名单过滤关键词。
2. 时间盲注漏洞
漏洞位置
- 接口路径:
/sys/dict/loadTreeData - 相关类:
org.jeecg.modules.system.controller.SysDictController
漏洞分析
-
SQL校验机制:
- 使用
SqlInjectionUtil.filterContent(dictCode)进行校验 - 校验流程:
- 检查参数是否为空
- 调用
checkSqlAnnotation方法进一步校验
- 使用
-
校验逻辑缺陷:
- 先检查违规字符和
sleep关键词 - 然后进行小写转换
- 导致大写
SLEEP可绕过检测
- 先检查违规字符和
-
影响范围:
/sys/dict/loadTreeData路由parseSql路由- 其他使用相同SQL查询逻辑的路由
漏洞利用
构造包含大写SLEEP的SQL语句实现时间盲注。
修复方案
修改正则表达式,使其不区分大小写匹配sleep关键词。
3. 普通用户越权查询漏洞
漏洞位置
- 接口路径:
/sys/dict/loadTreeData - 相关类:
org.jeecg.modules.system.controller.SysDictController
漏洞分析
-
权限控制缺陷:
- 未对用户权限进行有效限制
- 普通用户可查询管理员账号密码等敏感信息
-
黑名单检测机制:
- 使用
isPass方法进行表名检查 - 解析SQL语句获取表信息
- 检查表和字段是否在黑名单中
- 使用
-
过滤绕过方式:
- 对
sys类型表的正则匹配不完全 - 通过为表添加别名可绕过过滤
- 示例:
sys_user as a
- 对
漏洞利用
构造包含敏感表别名的SQL查询,获取管理员账号密码等信息。
修复方案
多次修复后最终方案:
- 去除表名前后的空格
- 如果表名包含数据库名(即
.),去除数据库名部分 - 去除表名中的空格
- 使用正则表达式去除表名中的特殊字符(空格、括号、反引号等)
总结:SQL注入常见成因
-
SQL语句过滤不完全:
- 黑名单关键词缺失
- 正则表达式不完善
- 特殊字符处理不彻底
-
代码逻辑错误:
- 过滤顺序不当(如先检查后转换大小写)
- 条件判断逻辑缺陷
-
权限控制不足:
- 未进行身份验证
- 权限校验不严格
- 敏感数据访问控制缺失
防御建议
- 使用预编译语句和参数化查询
- 实施严格的白名单过滤机制
- 对所有数据库操作进行权限控制
- 关键操作需进行多重验证
- 定期进行代码审计和安全测试
- 及时更新依赖库和组件版本
通过深入理解这些漏洞的成因和利用方式,开发人员可以更好地编写安全的代码,避免类似的安全问题。