SQL注入语句(select*from(select+sleep(10)union/**/select+1)a)解析
针对该SQL注入探测载荷的解答
你从日志里抓到的攻击载荷如下:
(select*from(select+sleep(10)union/**/select+1)a)
初步判断校正
你的判断里有两个错误点:
- 末尾的
a根本不是用来探测以a开头的表。SQL语法要求所有FROM后面跟的嵌套子查询必须定义别名,这里攻击者只是随手写了个最短的单字符a凑合法语法,和你数据库里存了什么表没有关系。 - 不存在“UNION匹配到内容sleep才会执行”的逻辑。这就是个最基础的时间盲注探活payload:只要注入点真的存在、这段语句能被数据库正常解析,
sleep(10)就会执行,攻击者只需要看发出去的请求是不是延迟了10秒才返回,就能确认有没有注入漏洞,根本不需要匹配你库里的任何内容。
你判断站点没被入侵的结论是对的。这种payload全是自动化漏洞扫描器批量扫全网的时候发的通用包,既没有后续异常请求,你自己测试也复现不了执行,说明请求早就被你的站点防护拦下来了,根本没碰到数据库,没有实际风险。
两个细节疑问解答
- 语句里的
+是URL编码格式的空格。HTTP查询字符串里不能直接传裸空格,常规转义方式要么是%20要么就是+,这些加号在请求被业务逻辑处理的时候会被解码成空格,对应SQL语句里关键字、函数之间的必要间隔,比如select+sleep(10)解码后就是正常的select sleep(10)。 - 插在中间的
/**/是用来绕过防护规则的。这是SQL支持的空注释语法,数据库解析语句的时候会直接跳过注释内容,完全不影响语句正常执行。很多低配WAF、注入防护规则就是靠匹配union select这种连续的敏感关键字拦截攻击,在两个关键字中间塞个空注释,就能把连续的特征串拆成union/**/select,直接绕开这种基于字符串匹配的检测逻辑。
内容的提问来源于stack exchange,提问作者James Paterson
相关产品推荐
相关产品推荐

