【发布时间】:2013-10-16 13:57:08
【问题描述】:
我正在尝试 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)
【问题讨论】:
-
我理解,但正如您可能猜到的那样,我正在尝试 SQLi 攻击,并且由于编译器不顾警告执行此查询,攻击是成功的——我想知道它的原因作品。那么,我可以假设值“B”在布尔意义上被视为“真”吗?
-
好的......你最初的问题很不清楚。您可能应该提到您的意图,您知道这是不正确的语法,并且您想知道 MySQL 中的查询结果,特别是。请参阅我的更新答案。
-
我已更新您的问题以包含您评论中的信息。如果我误解了,请编辑。
标签: mysql sql logical-operators