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 解析规则
- 当标识符为
d、t或ts时,MySQL会将其解析为特定的日期/时间函数 - 对于其他任意标识符,MySQL会直接返回表达式部分的内容
- 表达式部分可以是任何有效的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注入检测时:
- 将输入分解为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. 相关资源
7. 总结
MySQL的ODBC转义语法{标识符 表达式}提供了一种绕过SQL注入检测的新方法。安全研究人员和开发人员需要了解这种技术,并在防御措施中加以考虑。通过分析libinjection的绕过案例,我们可以更好地理解SQL注入检测工具的局限性,并改进防御策略。