我正在尝试 SQLi 攻击。
尽管出现警告,编译器仍执行以下查询:
select * from users where username='A' or 'B' and password='C';
因为查询执行,所以攻击成功。为什么这个查询有效,它在做什么?我可以假设值“B”在布尔意义上被视为“真”吗?逻辑运算符如何相互配合?数学有没有像 BODMAS 这样的特定顺序?请注意,“B”是独立的,而不是布尔条件。
上述格式的查询在 mysql 数据库中工作正常,并返回与查询相同的结果:
select * from users where username='A';
不返回任何语法错误。
mysql> select * from authentication where user='A' or 'B' and password='C';
+------+----------+
| user | password |
+------+----------+
| A | B |
+------+----------+
1 row in set, 1 warning (0.00 sec)
警告如下:
mysql> show warnings;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'B' |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)