2013-01-19 126 views
1

有關於SQL注入的文章:Abusing MySQL string arithmetic for tiny SQL injections什麼是選擇「意義」 - 「」

的問題是,什麼是select ''-''意思?我嘗試用MySQL,它會返回:

mysql> select ''-''; 
+-------+ 
| ''-'' | 
+-------+ 
|  0 | 
+-------+ 
1 row in set (0.00 sec) 

什麼發生?什麼意思是0?

select '-'結果:

mysql> select '-'; 
+---+ 
| - | 
+---+ 
| - | 
+---+ 
1 row in set (0.00 sec) 

我對這些結果非常困惑。

+0

傑克M..Added一些細節檢查.. –

回答

2

您是零下-從一個空字符串''到其他:

如下圖:

mysql> select ''; 
+--+ 
| | 
+--+ 
| | 
+--+ 
1 row in set (0.00 sec) 

mysql> select '3'-'2'; 
+---------+ 
| '3'-'2' | 
+---------+ 
|  1 | 
+---------+ 
1 row in set (0.00 sec) 

但警告如果不數字字符串

mysql> select 'a'-'b'; 
+---------+ 
| 'a'-'b' | 
+---------+ 
|  0 | 
+---------+ 
1 row in set, 2 warnings (0.00 sec)  

兩個警告:

mysql> SHOW WARNINGS LIMIT 2 
    -> ; 
+---------+------+---------------------------------------+ 
| Level | Code | Message        | 
+---------+------+---------------------------------------+ 
| Warning | 1292 | Truncated incorrect DOUBLE value: 'a' | 
| Warning | 1292 | Truncated incorrect DOUBLE value: 'b' | 
+---------+------+---------------------------------------+ 
2 rows in set (0.00 sec) 

爲什麼empty字符串沒有警告?

在哪裏,因爲是空字符串,沒有警告,因爲它(鑄造的東西)0見下文:

mysql> SELECT 0 = ''; 
+--------+ 
| 0 = '' | 
+--------+ 
|  1 | 
+--------+ 
1 row in set (0.00 sec) 

因此做''-''你正在做0 - 0

mysql> SELECT '' - ''; 
+---------+ 
| '' - '' | 
+---------+ 
|  0 | 
+---------+ 
1 row in set (0.00 sec) 

更清晰我加入下面的例子(我覺得會對你有所幫助):
How co n版本發生:

mysql> SELECT '0' = 0 
    -> ; 
+---------+ 
| '0' = 0 | 
+---------+ 
|  1 | 
+---------+ 
1 row in set (0.00 sec) 

通知其轉換:

mysql> SELECT '' = '0' 
    -> ; 
+----------+ 
| '' = '0' | 
+----------+ 
|  0 | 
+----------+ 
1 row in set (0.00 sec) 

''轉化爲0'0'轉化爲0''不等於'0'

mysql> SELECT '1' = 1 
    -> ; 
+---------+ 
| '1' = 1 | 
+---------+ 
|  1 | 
+---------+ 
1 row in set (0.00 sec) 

mysql> SELECT '' = 1 
    -> ; 
+--------+ 
| '' = 1 | 
+--------+ 
|  0 | 
+--------+ 
1 row in set (0.00 sec) 
1

''是一個空字符串; -是減法。所以你從另一個減去一個空字符串。減法是一個數字運算符,因此它的結果是一個數字,並且在減去它們之前,mysql將它的參數轉換成數字。 ''的數值是零 - 但它並不重要,因爲從它自身減去的任何數字都會給零。

2

我解釋select ''-'',這是一樣的select '' - '',爲select cast('' as int) - cast('' as int)這是select 0-0 ..

隨着select '-'你只是得到一個字符串。希望是有道理的......

相關問題