2013-10-06 146 views
8

我是做了些功课我的涉及SQL注入安全等级。我发现我可以执行比典型的' OR '1'=1示例更短的SQL注入。相反,我可以做'='。键入这是对典型的登录框中输入密码字段给出一个SQL查询是这样的:为什么选择 'A'= 'B' 的MYSQL = 'C' 返回1?

SELECT * FROM Users WHERE username='user' AND password=''=''; 

事实证明,password=''=''计算结果为1,使SQL注入工作。

做一些更多的测试后,我发现,如果我测试一个字符串是否等于0,则返回1:

SELECT 0='a'; 

所以在我的例子中,password=''将评估为0和0=''竟又评估为1

我的测试表明我这是怎么发生的,但我想知道为什么发生(即为什么0='a'真的吗?

+2

在此页面搜索“香蕉”:http://grimoire.ca/mysql/choose-something-else –

回答

4

作为Type Conversion in Expression Evaluation下记录,一个字符串和一个整数之间的比较将数值进行:

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

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

转换字符串到浮子将考虑每个数字字符(和第一周期或幂字符)遇到到第一非数字字符。因此'hello''a'将被截断为''(从而投射到零),而将'123.45e6foo789'截断为'123.45e6'(并由此转换为123450000)。

因此,人们可以看到0='a'是真实的:它相比0=0

password=''=''为真(提供password是一个非空字符串,或非零数值)来约因为待数值执行在零第一比较结果(假),这迫使第二比较(因此将''转换为零以与第一比较的零结果进行比较)。

4

Mysql发现比较并将字符串转换为整数,但这会导致无效整数,因此将其转换为0。0 = 0因此其真值(1)

0

对于SELECT 0 ='a',0 = '';

1. type of 0 is int 
2. type of 'a' is char then CAST('a' AS UNSIGNED) or CAST('' AS UNSIGNED) will be 0 

将char转换为int然后0 = 0评估你的情况是真实1. 在:

select 'A'='a', 0=0, '0'='a',0='a1'; 

所有列将是真实的,但对于:

select 0='1a'; 

会是假的,因为CAST( '1A' AS UNSIGNED)为1

mysql> SELECT 'asadsadsa' = 'a', 0 = 'az', cast('az' AS unsigned) , 'asadsadsa' = 'a' = 'az', 0 =0; 
     +-------------------+----------+--------------------------+--------------------------+------+ 
     | 'asadsadsa' = 'a' | 0 = 'az' | cast('az' AS unsigned) | 'asadsadsa' = 'a' = 'az' | 0 =0 | 
     +-------------------+----------+--------------------------+--------------------------+------+ 
     |     0 |  1 |      0 |      1 | 1 | 
     +-------------------+----------+--------------------------+--------------------------+------+ 
     1 row in set, 3 warnings (0.00 sec) 

     Warning (Code 1292): Truncated incorrect DOUBLE value: 'az' 
     Warning (Code 1292): Truncated incorrect INTEGER value: 'az' 
     Warning (Code 1292): Truncated incorrect DOUBLE value: 'az' 
+0

为什么要将'a'作为无符号赋予您0?我对SQL不是很熟悉,但它不应该给出'a'的ASCII值吗? – gsingh2011

+0

在这里阅读更多 http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html –

+0

像在Php(int)中一样,“a1”= 0,'1a'= 1,我用这个例子来展示MySQL如何转换字符串;查看两种不同类型之间的比较。 –

相关问题