我是Pentest的新手,对MySQL的运算符优先级和类型转换有疑问。 (WHERE子句中有多个比较运算符)
表结构如下所示(DVWA用户表):
user_id int(6)
first_name varchar(15)
last_name varchar(15) .....
我测试了以下查询的结果(在MySQL 5.7中)。 (P.S.这些查询用于绕过或只是为了娱乐)
SELECT * FROM users WHERE user_id = 1&1=1;
SELECT * FROM users WHERE user_id = 1&1=0;
SELECT * FROM users WHERE user_id = 0&1=0;
SELECT * FROM users WHERE user_id = 1&0=1;
第一个查询返回1条记录(user_id = 1),第二个查询返回除user_id = 1以外的所有记录。第三个返回所有记录,最后一个不返回记录。
前四个查询具有相同的输出,后四个查询具有相同的输出,因为按位与(&)的优先级最高:
SELECT * FROM users WHERE user_id = 1=1;
SELECT * FROM users WHERE user_id = 1=0;
SELECT * FROM users WHERE user_id = 0=0;
SELECT * FROM users WHERE user_id = 0=1;
我的问题是:两次比较的优先顺序是什么? (因为boolean是tinyint(1),并且在比较int(6)和tinyint(1)时不应进行任何转换,不像比较string和int)最后,我还要测试SELECT * FROM users WHERE user_id = 0<1;
和SELECT * FROM users WHERE user_id =0=1=0;
得到的结果与第三个相同。
在我看来真的很奇怪。
谢谢大家的帮助。