代码审计之实战中各类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

漏洞分析

  1. 漏洞触发流程

    • show方法接收JSON数据中的idparams参数
    • 参数传递到jmReportDesignService.show进行查询
    • 最终执行getDbSql方法进行SQL查询
  2. 过滤机制缺陷

    • 过滤方法: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
  3. 未授权访问

    • 该路由未进行身份验证
    • 无需登录和token即可直接访问

漏洞利用

由于黑名单过滤不完全,攻击者可构造包含asciihaving等关键字的SQL语句实现布尔盲注。

修复方案

升级积木报表版本,补全黑名单过滤关键词。

2. 时间盲注漏洞

漏洞位置

  • 接口路径:/sys/dict/loadTreeData
  • 相关类:org.jeecg.modules.system.controller.SysDictController

漏洞分析

  1. SQL校验机制

    • 使用SqlInjectionUtil.filterContent(dictCode)进行校验
    • 校验流程:
      • 检查参数是否为空
      • 调用checkSqlAnnotation方法进一步校验
  2. 校验逻辑缺陷

    • 先检查违规字符和sleep关键词
    • 然后进行小写转换
    • 导致大写SLEEP可绕过检测
  3. 影响范围

    • /sys/dict/loadTreeData路由
    • parseSql路由
    • 其他使用相同SQL查询逻辑的路由

漏洞利用

构造包含大写SLEEP的SQL语句实现时间盲注。

修复方案

修改正则表达式,使其不区分大小写匹配sleep关键词。

3. 普通用户越权查询漏洞

漏洞位置

  • 接口路径:/sys/dict/loadTreeData
  • 相关类:org.jeecg.modules.system.controller.SysDictController

漏洞分析

  1. 权限控制缺陷

    • 未对用户权限进行有效限制
    • 普通用户可查询管理员账号密码等敏感信息
  2. 黑名单检测机制

    • 使用isPass方法进行表名检查
    • 解析SQL语句获取表信息
    • 检查表和字段是否在黑名单中
  3. 过滤绕过方式

    • sys类型表的正则匹配不完全
    • 通过为表添加别名可绕过过滤
    • 示例:sys_user as a

漏洞利用

构造包含敏感表别名的SQL查询,获取管理员账号密码等信息。

修复方案

多次修复后最终方案:

  1. 去除表名前后的空格
  2. 如果表名包含数据库名(即.),去除数据库名部分
  3. 去除表名中的空格
  4. 使用正则表达式去除表名中的特殊字符(空格、括号、反引号等)

总结:SQL注入常见成因

  1. SQL语句过滤不完全

    • 黑名单关键词缺失
    • 正则表达式不完善
    • 特殊字符处理不彻底
  2. 代码逻辑错误

    • 过滤顺序不当(如先检查后转换大小写)
    • 条件判断逻辑缺陷
  3. 权限控制不足

    • 未进行身份验证
    • 权限校验不严格
    • 敏感数据访问控制缺失

防御建议

  1. 使用预编译语句和参数化查询
  2. 实施严格的白名单过滤机制
  3. 对所有数据库操作进行权限控制
  4. 关键操作需进行多重验证
  5. 定期进行代码审计和安全测试
  6. 及时更新依赖库和组件版本

通过深入理解这些漏洞的成因和利用方式,开发人员可以更好地编写安全的代码,避免类似的安全问题。

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语句过滤不完全 : 黑名单关键词缺失 正则表达式不完善 特殊字符处理不彻底 代码逻辑错误 : 过滤顺序不当(如先检查后转换大小写) 条件判断逻辑缺陷 权限控制不足 : 未进行身份验证 权限校验不严格 敏感数据访问控制缺失 防御建议 使用预编译语句和参数化查询 实施严格的白名单过滤机制 对所有数据库操作进行权限控制 关键操作需进行多重验证 定期进行代码审计和安全测试 及时更新依赖库和组件版本 通过深入理解这些漏洞的成因和利用方式,开发人员可以更好地编写安全的代码,避免类似的安全问题。