MYSQL SLEEP在EXISTS块内

时间:2017-06-01 14:25:21

标签: mysql sql sql-injection

当我在SQL服务器上执行此SQL代码时:

SELECT SLEEP(3);

服务器休眠3秒钟。但是,当我执行此代码时:

SELECT * FROM costumers WHERE EXISTS(SELECT SLEEP(3));

服务器立即打印表'costumers'而不等待3秒......是否有一个SLEEP函数的解释,只是在从EXISTS块调用它时不等待指定的持续时间返回?这段代码中的BENCHMARK函数也是如此:

SELECT * FROM costumers WHERE EXISTS(SELECT BENCHMARK(100, MD5(1)))

我需要在这个特定的结构中执行'SLEEP'函数,因为它在SQL注入练习中使用,更准确地说是盲注SQL练习。

另外,如果您知道另一种编写使服务器等待的MYSQL语句的方法,那将会有所帮助。

2 个答案:

答案 0 :(得分:1)

查询优化器显然确定SELECT SLEEP(3)始终返回TRUE,因此会删除代码。

此查询会休眠:

SELECT * FROM table1 WHERE EXISTS(SELECT SLEEP(3) UNION SELECT 1);

对于MySQL优化器来说,联合显然太复杂了,所以它执行它。实际上,在此查询上使用EXPLAIN需要3秒 - 它意识到子查询不依赖于任何表,因此它在确定查询计划时执行它。

答案 1 :(得分:0)

我认为你会被困在

SELECT SLEEP(3); SELECT * FROM customers;

组合。