gpt4 book ai didi

mysql - SQL 中的 And Or 条件,但未正确嵌套它们

转载 作者:行者123 更新时间:2023-11-29 03:52:22 26 4
gpt4 key购买 nike

我正在尝试 SQLi 攻击。

尽管有警告,编译器仍执行以下查询:

select * from users where username='A' or 'B' and password='C';

因为查询执行了,所以攻击成功了。为什么这个查询有效,它在做什么?我可以假设值“B”在 bool 意义上被视为“真”吗?逻辑运算符如何相互协作?数学有没有像BODMAS这样的特定顺序?请注意,“B”是独立的,而不是 bool 条件。

上述格式的查询在 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)

最佳答案

更新

根据您更新的问题和评论,您似乎已经意识到语法中的错误并且想知道具体 MySQL 是如何处理这个查询的。

看起来 MySQL 首先将字符串转换为整数值(产生警告)。

MySQL 处理任何 non-zero number as TRUE ,所以 'B' 在转换为整数后,将计算为 TRUE


首先,我认为您的查询在我所知道的任何 DBMS 中都无效。既然你说 'B' 不是 bool 条件,那么我不得不认为你的意思是:

select * from users where username IN ( 'A', 'B' ) and password='C';

当然,这会使您关于 BODMAS 的问题无效.因此,为了回答您的核心问题,我将把您的 SQL 更改为:

select * from users where username='A' or username='B' and password='C';

这将取决于 DBMS 及其选择解析 SQL 的方式。通常 AND 应该优先于 OR,但显然软件开发人员可以自由地实现他们喜欢的 SQL,所以我相信你可以找到反例如果您看起来够努力了(例如,可能是按顺序处理 bool 运算符的 DBMS)。

SQL Server 将在 OR

之前处理 AND

http://technet.microsoft.com/en-us/library/ms190276.aspx

username='A' or ( username='B' and password='C' )

MySQL 还会在 OR

之前处理 AND

http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html

username='A' or ( username='B' and password='C' )

Sybase 将在 OR

之前处理 AND

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sqlug/html/sqlug/sqlug102.htm

username='A' or ( username='B' and password='C' )

DB2 与其他数据库一样,将在 OR

之前处理 AND

http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z9.doc.sqlref%2Fsrc%2Ftpc%2Fdb2z_precedenceofoperations.htm

username='A' or ( username='B' and password='C' )

即使是 MS Access,我所知道的最不符合标准的 SQL 实现之一,也保留了 AND-before-OR 优先级:

http://office.microsoft.com/en-us/access-help/HV080756432.aspx

username='A' or ( username='B' and password='C' )

关于mysql - SQL 中的 And Or 条件,但未正确嵌套它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19405423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com