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'
真的?
如表达式评估中的类型转换中所述,字符串和整数之间的比较将以数字方式执行:
- 在所有其他情况下,参数将作为浮点(实数)数进行比较。
因此,操作数被转换为浮点数,然后进行比较。
将字符串转换为浮点数将考虑遇到的每个数字字符(以及第一个句点或求幂字符),直到第一个非数字字符。因此'hello'
or'a'
将被截断为''
(并因此强制转换为零)而'123.45e6foo789'
将被截断为'123.45e6'
(从而强制转换为 123,450,000)。
因此可以看出0='a'
它是如何为真的:它被比较为0=0
。
这password=''=''
是真的(如果它 password
是一个非空字符串或非零数字)是因为第一次比较结果为零(假),这迫使第二次比较以数字方式执行(因此转换''
为零以与第一次比较的零结果)。
归档时间: |
|
查看次数: |
2472 次 |
最近记录: |