MySQL的SLEEP()函数可用于时间盲注,但需版本≥5.0.12且用户具备PROCESS权限;常见失效原因包括版本过低、权限缺失及Web层超时;典型用法为嵌入IF()或AND条件中,如AND IF(SUBSTR((SELECT database()),1,1)='a', SLEEP(3), 0)。

MySQL 的 SLEEP() 函数到底能不能用在注入里
能,但得看版本和权限——5.0.12 以上才内置,且执行用户必须有 PROCESS 权限(很多生产环境默认禁用)。它不是“让 SQL 等一会儿再查”,而是让整个查询线程挂起指定秒数,响应时间变长,靠这个时间差来盲注判断逻辑分支。
为什么 SLEEP(5) 有时没反应
常见原因有三个:
- MySQL 版本低于 5.0.12,
SLEEP()函数不存在,报错FUNCTION does not exist - 当前数据库用户被移除了
PROCESS权限(尤其云数据库如阿里云 RDS、腾讯云 CDB 默认关闭) - Web 应用层设置了超时(比如 Nginx 的
proxy_read_timeout设为 3s),还没等到SLEEP(5)结束就断连了
SLEEP() 在布尔/时间盲注中的典型写法
它不返回数据,只拖时间,所以必须嵌进条件语句里触发。常用组合是 IF() 或 AND + 子查询:
判断库名第一个字符是否为 'a':AND IF(SUBSTR((SELECT database()),1,1)='a', SLEEP(3), 0)
注意两点:
-
SLEEP()第一个参数是秒数,支持小数,比如SLEEP(0.5)更隐蔽,但受系统调度精度限制,低于 0.1 秒基本不可靠 - 不能直接写
OR SLEEP(3)—— 如果前面条件为真,后面根本不会执行;必须用IF()或确保前半部分恒为真(如1=1 AND ...)
比 SLEEP() 更稳的替代方案
当 SLEEP() 被禁或不准时,可尝试:
- 用
BENCHMARK():比如BENCHMARK(1000000,MD5('test')),靠 CPU 消耗拖时间,不依赖权限,但容易被 WAF 拦截关键词 - DNS 外带(
LOAD_FILE(CONCAT('\\', ...))或SELECT ... INTO OUTFILE配合 UNC 路径),适用于高权限且出网场景 - 如果目标用的是 PostgreSQL,换
pg_sleep();SQL Server 用WAITFOR DELAY '0:0:5'
实际打的时候,别只盯 SLEEP() —— 先 SELECT @@version 看清版本,再 SELECT CURRENT_USER() 看权限,最后选路径。时间盲注最耗耐心的地方,往往不是函数怎么写,而是网络抖动、中间件超时、甚至数据库负载波动导致的误判。










