为什么SELECT'a'='b'='c'在MYSQL中返回1?

gsi*_*011 8 mysql sql sql-injection

我正在为涉及SQL注入的安全类做一些功课.我发现我可以比典型的' OR '1'=1例子做更短的SQL注入.相反,我可以做到'='.输入这个是在典型登录框的密码字段中给出一个SQL查询,如下所示:

SELECT * FROM Users WHERE username='user' AND password=''='';
Run Code Online (Sandbox Code Playgroud)

事实证明,password=''=''求值1,允许SQL注入工作.

做了一些测试后,我看到如果我测试一个字符串是否等于0,它返回1:

SELECT 0='a';
Run Code Online (Sandbox Code Playgroud)

所以在我的例子中,password=''将评估为0并0=''最终评估为1.

我的测试向我展示了这是如何发生的,但我想知道为什么会发生这种情况(即为什么是0='a'真的?

egg*_*yal 6

表达式评估中的类型转换中所述,字符串和整数之间的比较将以数字方式执行:

  • 在所有其他情况下,参数将作为浮点(实数)数进行比较。

因此,操作数被转换为浮点数,然后进行比较。

将字符串转换为浮点数将考虑遇到的每个数字字符(以及第一个句点或求幂字符),直到第一个非数字字符。因此'hello'or'a'将被截断为''(并因此强制转换为零)而'123.45e6foo789'将被截断为'123.45e6'(从而强制转换为 123,450,000)。

因此可以看出0='a'它是如何为真的:它被比较为0=0

password=''=''是真的(如果它 password是一个非空字符串或非零数字)是因为第一次比较结果为零(假),这迫使第二次比较以数字方式执行(因此转换''为零以与第一次比较的零结果)。