今天朋友问我,使用and 和or 进行延时注入会返回不同的结果。我思索了一下,貌似确实有这么个印象。回家后又总结了下关于 and 与 or 进行延时盲注时的不同。
延时盲注关于优先级的发现
下面看例子
当使用and进行连接时,第一条执行了sleep(1)函数,而第二条没有执行sleep(1)函数
当使用or进行连接时,第一条没有执行sleep(1),而第二条执行了sleep(1),与and的结论是相反的。
经过上网查询并经自己测试之后,发现mysql的查询相关策略(可能有误,欢迎指正):
- mysql执行顺序为从左到右
- 在select后,多个and中,如果左侧有恒为0的值,则直接返回0,不执行同级右侧的其他语句。在where后,多个and中,如果两侧有恒为0的值,则直接返回0
- 在select后,多个or连接的语句中如果左侧有值恒为1,则直接返回1,不执行同级右侧的其他语句。在where后,多个or连接的语句如果两侧有值恒为1,则直接返回1。
- and优先级大于or
- 在select后,当既有and又有or时,将and及其左右连接的值看做一个整体(两侧加小括号,因为and优先级比or高)。若处理后or左侧连接的值为恒为1,则直接返回1,不执行右侧内容
- 在where后,若and和or同时出现,将and两侧连接的数值看成一个整体,先检查or两侧是否有直接连接恒为1的值,若有,直接返回1,若没有,再从左到右依次进行计算。
最后附一张mysql运算符的优先级