关于 mysql 数据库在查询过程中的沉睡问题

(1)if(condition, sleep(time), return) 函数,若 condition 为真,则执行 sleep() 函数,若为假,则返回 return 的值,mysql 对于 or 和 and 的解析很奇怪;

(2)if 在 where 后面的例子:

对于:select * from users where id=1111 and if(1=1,sleep(2),0);  不会进入沉睡:

对于:select * from users where id=1 and if(1=1,sleep(2),0);  数据库会沉睡 2秒 左右,这符合我们的预期;

对于:select * from users where id=1 or if(1=1,sleep(1),0);  它和下面这句查询语句的效果是一样的,select * from users where id=111 or if(1=1,sleep(1),0);  它们都会沉睡 10多秒 ,这与我们预期不一致,目前我的理解是 mysql 会对每一行进行查询,当 id 值不符合查询时,每一行都会沉睡 1秒 ;

注意:mysql 的 or 语句无论前后两个条件正确与否,都会进行执行然后判断

(3)if 在 order by 后面的例子:

对于:select * from users order by 1 and if(1=1,sleep(1),0); 和下面一句一样

select * from users order by 1111 and if(1=1,sleep(1),0);   都会沉睡 10多秒

对于:select * from users order by 1 or if(1=1,sleep(2),0);   它和 select * from users order by 1111 or if(1=1,sleep(0.1),0); 一样,都不会使数据库沉睡

这时候若还是要通过时间盲注写脚本爬取数据库信息,

就只能缩短 select * from users order by 1111 and if(1=1,sleep(1),0); 的延时时间,

例如:select * from users order by 1111 and if(1=1,sleep(0.1),0);

你可能感兴趣的:(mysql,sql,数据库)