【SQL注入实战】sleep()与benchmark():从函数原理到跨数据库延时攻击Payload构造

📅 2026/6/28 22:03:12
【SQL注入实战】sleep()与benchmark():从函数原理到跨数据库延时攻击Payload构造
1. 延时注入的核心原理延时注入是SQL注入攻击中一种特殊的技术手段它通过人为制造数据库响应时间的差异来推断数据库信息。这种技术特别适用于那些没有直接回显的Web应用场景。想象一下当你面对一个没有任何错误提示、也不显示查询结果的页面时传统的注入手段可能就失效了。这时候延时注入就像一把听诊器通过观察数据库的心跳变化来获取我们需要的信息。在MySQL中最常用的两个延时函数是sleep()和benchmark()。sleep()函数非常简单直接它让数据库暂停执行指定的秒数。比如执行SELECT SLEEP(5)会让数据库暂停5秒后才返回结果。而benchmark()函数则通过重复执行某个计算来制造延时比如SELECT BENCHMARK(1000000, SHA1(test))会让数据库执行100万次SHA1哈希计算从而产生明显的延迟。2. MySQL延时函数详解2.1 sleep()函数的工作原理sleep()函数是MySQL中最直观的延时工具。它的语法非常简单SLEEP(seconds)其中seconds参数指定要暂停的秒数。这个函数会阻塞当前连接的执行直到指定的时间过去。在实际测试中我发现一个有趣的现象sleep()的精度在不同MySQL版本中有所不同。在5.7版本中sleep(1)通常会精确到秒级但在高负载环境下可能会有几十毫秒的误差。使用sleep()时需要注意几个要点它只对当前连接有效不会影响其他数据库连接如果查询被中断比如客户端断开连接sleep会被立即终止在事务中使用sleep()会持有锁可能导致严重的性能问题2.2 benchmark()函数的妙用benchmark()函数的语法是BENCHMARK(count, expr)它会重复执行expr表达式count次。这个函数原本是用来测试性能的但在安全测试中我们巧妙地把它变成了延时工具。比如BENCHMARK(10000000, MD5(test))会让数据库计算1000万次MD5哈希。在实际测试中我发现benchmark()产生的延时比sleep()更不稳定因为它依赖于服务器的CPU性能。在一台4核服务器上同样的benchmark调用可能比在单核服务器上快3-4倍。另外benchmark()不会像sleep()那样精确控制延时时间但它有个优势某些WAFWeb应用防火墙可能不会检测benchmark()函数而会拦截sleep()。3. 条件延时注入实战3.1 结合if()函数构造Payloadif()函数是构造条件延时Payload的关键。它的语法是IF(condition, value_if_true, value_if_false)。我们可以把延时函数放在value_if_true或value_if_false位置根据条件决定是否触发延时。举个实际例子假设我们要判断当前数据库名的第一个字母是否大于ASCII码100?id1 AND IF(ASCII(SUBSTRING(database(),1,1))100, SLEEP(5), 0) --如果数据库名的第一个字母ASCII码大于100页面响应会延迟5秒否则立即返回。通过不断调整比较值我们就可以逐个字符地推断出完整的数据库名。3.2 使用case when实现复杂逻辑对于更复杂的条件判断case when语句提供了更大的灵活性。它的基本结构是CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default_result END在延时注入中我们可以这样使用%3bSELECT CASE WHEN (SELECT COUNT(*) FROM users WHERE usernameadmin)1 THEN SLEEP(5) ELSE 0 END --这个Payload会检查users表中是否存在用户名为admin的记录如果存在就延时5秒。通过观察响应时间我们就能知道是否存在admin账户。4. 跨数据库延时技术对比4.1 PostgreSQL的延时方法PostgreSQL使用pg_sleep()函数实现延时语法与MySQL的sleep()类似 OR pg_sleep(5) --PostgreSQL还提供了pg_sleep_for()和pg_sleep_until()函数可以更精确地控制延时时间。一个有趣的特点是在PostgreSQL中即使客户端断开连接pg_sleep()也会继续执行完这与MySQL的行为不同。4.2 SQL Server的WAITFOR DELAYSQL Server使用WAITFOR DELAY语句实现延时语法有些特殊 OR WAITFOR DELAY 0:0:5 --这里的0:0:5表示5秒钟。SQL Server还支持WAITFOR TIME语法可以在特定时间点恢复执行。在实际测试中我发现SQL Server的延时精度通常比MySQL更高。4.3 Oracle的延时实现Oracle数据库使用DBMS_LOCK.SLEEP()函数 OR DBMS_LOCK.SLEEP(5) --需要注意的是执行这个函数通常需要特定的权限。如果没有权限可以尝试使用其他制造CPU负载的方法来实现延时比如复杂的正则表达式或XML解析。5. 实战技巧与注意事项在实际渗透测试中延时注入需要特别注意几个问题。首先是时间精度网络延迟和服务器负载都会影响我们的判断。我通常会先发送几个测试Payload来确定基准响应时间然后再设置一个明显的延时阈值比如3秒以上。其次是要注意WAF的检测。很多WAF会监控异常的sleep或benchmark调用。这时候可以尝试以下绕过技巧使用注释分割关键字SLE/**/EP(5)使用十六进制编码0x736C656570是sleep的十六进制表示使用变量拼接CONCAT(sl,eep)(5)最后要提醒的是延时注入通常会产生大量数据库负载在生产环境测试时一定要谨慎最好在非高峰时段进行并且控制注入频率。我曾经在一个客户的生产环境不小心发送了太密集的延时注入请求导致数据库连接池耗尽这是个值得吸取的教训。