MySQL利用ODBC转义({})注入手法分析
字数 1115 2025-08-10 08:29:06

MySQL利用ODBC转义({})注入手法分析

1. 背景介绍

MySQL从3.23版本开始支持ODBC转义语法,这种语法形式为{标识符 表达式},主要用于兼容ODBC标准。攻击者可以利用这种语法特性绕过某些SQL注入检测工具,如libinjection。

2. ODBC转义语法原理

2.1 语法结构

MySQL中的ODBC转义语法格式为:

{标识符 表达式}

在MySQL源码中,这对应于simple_expr(简单表达式)的一种形式,由PTI_odbc_date类负责解析。

2.2 解析规则

  1. 当标识符为dtts时,MySQL会将其解析为特定的日期/时间函数
  2. 对于其他任意标识符,MySQL会直接返回表达式部分的内容
  3. 表达式部分可以是任何有效的MySQL表达式

3. 注入利用手法

3.1 基本注入Payload

示例Payload:

1={date(if(mid((updatexml(1,concat(0x7e,(select user()),0x7e),1)),1,1)='1',2,1))}

解释:

  • date:任意标识符(不一定是函数名)
  • 括号内为完整的MySQL表达式,包含报错注入逻辑

3.2 变体形式

表达式部分可以不使用括号分隔,改用空格:

1={date if(mid((updatexml(1,concat(0x7e,(select user()),0x7e),1)),1,1)='1',2,1)}

这种形式同样能触发SQL注入,但可能绕过某些检测机制。

4. 绕过libinjection检测分析

4.1 libinjection的检测机制

libinjection在处理SQL注入检测时:

  1. 将输入分解为token
  2. 对token进行折叠处理
  3. 应用检测规则

4.2 绕过原因

libinjection的token处理存在以下特点:

  1. { + BAREWORD(裸词)的组合会被折叠
  2. { + FUNCTION的组合不会被折叠
  3. 在ODBC语法中,{后的标识符应被视为BAREWORD,但libinjection可能错误地将其识别为FUNCTION

4.3 修复方案

两种可能的修复方法:

  1. 增加特征,将{ + FUNCTION的情况纳入检测
  2. 优化折叠代码,正确处理{ + FUNCTION的情况

5. 防御建议

5.1 对于libinjection用户

更新至最新版本,确保已修复此绕过问题。

5.2 通用防御措施

  1. 使用参数化查询
  2. 实施严格的输入验证
  3. 在WAF规则中添加对ODBC转义语法的检测
  4. 限制数据库用户权限

6. 相关资源

  1. MySQL源码
  2. MySQL手册(ODBC转义语法部分)
  3. libinjection源码

7. 总结

MySQL的ODBC转义语法{标识符 表达式}提供了一种绕过SQL注入检测的新方法。安全研究人员和开发人员需要了解这种技术,并在防御措施中加以考虑。通过分析libinjection的绕过案例,我们可以更好地理解SQL注入检测工具的局限性,并改进防御策略。

MySQL利用ODBC转义({})注入手法分析 1. 背景介绍 MySQL从3.23版本开始支持ODBC转义语法,这种语法形式为 {标识符 表达式} ,主要用于兼容ODBC标准。攻击者可以利用这种语法特性绕过某些SQL注入检测工具,如libinjection。 2. ODBC转义语法原理 2.1 语法结构 MySQL中的ODBC转义语法格式为: 在MySQL源码中,这对应于 simple_expr (简单表达式)的一种形式,由 PTI_odbc_date 类负责解析。 2.2 解析规则 当标识符为 d 、 t 或 ts 时,MySQL会将其解析为特定的日期/时间函数 对于其他任意标识符,MySQL会直接返回表达式部分的内容 表达式部分可以是任何有效的MySQL表达式 3. 注入利用手法 3.1 基本注入Payload 示例Payload: 解释: date :任意标识符(不一定是函数名) 括号内为完整的MySQL表达式,包含报错注入逻辑 3.2 变体形式 表达式部分可以不使用括号分隔,改用空格: 这种形式同样能触发SQL注入,但可能绕过某些检测机制。 4. 绕过libinjection检测分析 4.1 libinjection的检测机制 libinjection在处理SQL注入检测时: 将输入分解为token 对token进行折叠处理 应用检测规则 4.2 绕过原因 libinjection的token处理存在以下特点: { + BAREWORD (裸词)的组合会被折叠 { + FUNCTION 的组合不会被折叠 在ODBC语法中, { 后的标识符应被视为 BAREWORD ,但libinjection可能错误地将其识别为 FUNCTION 4.3 修复方案 两种可能的修复方法: 增加特征,将 { + FUNCTION 的情况纳入检测 优化折叠代码,正确处理 { + FUNCTION 的情况 5. 防御建议 5.1 对于libinjection用户 更新至最新版本,确保已修复此绕过问题。 5.2 通用防御措施 使用参数化查询 实施严格的输入验证 在WAF规则中添加对ODBC转义语法的检测 限制数据库用户权限 6. 相关资源 MySQL源码 MySQL手册(ODBC转义语法部分) libinjection源码 7. 总结 MySQL的ODBC转义语法 {标识符 表达式} 提供了一种绕过SQL注入检测的新方法。安全研究人员和开发人员需要了解这种技术,并在防御措施中加以考虑。通过分析libinjection的绕过案例,我们可以更好地理解SQL注入检测工具的局限性,并改进防御策略。