1. 程式人生 > >《11招玩轉網路安全》之第四招:low級別的DVWA SQL注入

《11招玩轉網路安全》之第四招:low級別的DVWA SQL注入

以DVWA為例,進行手工注入,幫助讀者瞭解注入原理和過程。

1、啟動docker,並在終端中執行命令:

docker ps -a

docker start LocalDVWA

docker ps

執行結果如圖4-19所示。

圖4-19  啟動DVWA

2、在瀏覽器位址列輸入127.0.0.1後回車,瀏覽器打開了DVWA頁面(DVWA在前面的章節中已建立完畢)。先點選左側欄的DVWA Security,將難度調整至Low級別。單擊左側欄的SQL Injection,進入SQL注入頁面,如圖4-20所示。

圖4-20  DVWA SQL注入

3、按照提示在文字框中填入使用者ID(這裡填入1),單擊Submit按鈕,執行結果如圖4-21 所示。

圖4-21  DVWA返回資料

4、返回了兩個欄位First name和Sumame。先看一下伺服器對使用者提交的資料User ID是如何處理的。單擊頁面右下角的View Source按鈕,如圖4-22所示。

圖4-22  Low級別SQL注入程式碼

從圖中可以看出伺服器對使用者輸入的資料id未做任何處理,直接用於SQL語句了。手工注入首先要確定頁面到底使用了資料庫中多少個欄位。再確定各個欄位的位置。最後在欄位的位置構建SQL語句,進行注入。

5、先確定使用的欄位數目,在文字框中輸入1’ order by 2#。此時伺服器接受資料,$query= “SELECT first_name, last_name From Users WHERE user_id=’1’ order by 2# ”。後面的構建方法大致都是如此,相當於自行輸入一個合法的SQL語句的後半截,加入到伺服器的SQL語句中去。單擊Submit按鈕,得到結果如圖4-23所示。

圖4-23  測試資料庫欄位1

6、能正常返回頁面,說明至少引用了兩個欄位(因為該頁面使用get方式提交資料,所以也可以在位址列中構建SQL語句進行注入。但需要注意一下,將空格、分號轉換成ascii程式碼格式)。繼續在文字框中輸入1’ order by 3#,單擊Submit按鈕,得到的結果如圖4-24所示。

圖4-24  測試資料庫欄位2

7、不能返回正常頁面,說明頁面中應用的資料庫欄位不超過3。結合前面一次的測試。可以得出結論,該頁面引用了資料庫中的2個欄位。下一步來檢視資料庫引用欄位存放的位置。在文字框中輸入1’ union select 1,2#。單擊Submit按鈕。得到的結果如圖4-25所示。

圖4-25  測試欄位位置

從上圖中可以看出,first name後面顯示的是第一個欄位,Sumame後面顯示的是第二個欄位。現在可以自行構建SQL語句,進行SQL注入。目前有2個位置可以注入,任選一個都可以,這裡選擇的是第二個位置。在文字框中輸入1’ union select 1,version()#,返回資料庫版本,如圖4-26所示。

圖4-26  返回資料庫版本

8、在文字框個輸入1’ union select database(),2#。這次選擇第一個欄位位置注入,返回了資料庫名字,如圖4-27所示。

圖4-27  返回資料庫名字

9、已知資料庫名字,可以通過查詢MySQL的information_schema資料庫中的tables表,得到DVWA資料庫中的所有表。在文字框中輸入1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#,返回DVWA資料庫中所有的表,如圖4-28所示。

圖4-28  返回資料庫中的表

10、上圖中可以看出,DVWA中的表有guestbook和users,這裡需要user表的內容。先獲取users表中的欄位。在文字框中輸入1' union select 1,group_concat(column_name) from information_schema.columns where table_name='user'#,返回獲取表users中的所有欄位,如圖4-29所示。

圖4-29  返回表字段

11、這裡返回了很多欄位,Host,User,Password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv,Show_db_priv,Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Repl_slave_priv,Repl_client_priv,Create_view_priv,Show_view_priv,Create_routine_priv,Alter_routine_priv,Create_user_priv,Event_priv,Trigger_priv,Create_tablespace_priv,ssl_type,ssl_cipher,x509_issuer,x509_subject,max_questions,max_updates,max_connections,max_user_connections,plugin,authentication_string,password_expired,is_role,default_role,max_statement_time。但實際上DVWA資料庫中的表users中並沒有這麼多的欄位,多出的欄位是MariaDB其他資料庫中users中的欄位。現在要做的是將DVWA資料庫中表users的欄位分離出來。在文字框中輸入1' and exists(select host from users)#,測試user欄位是否屬於表users。返回結果如圖4-30所示。

圖4-30  測試host欄位

12、返回了錯誤資訊,說明host欄位並不是DVWA資料庫表users中的欄位。繼續測試user欄位,在文字框中輸入1' and exists(select user from users)#,返回結果如圖4-31所示。

圖4-31  測試user欄位

13、能夠正常返回,說明user欄位是DVWA資料庫表users中的欄位。繼續這個一個個的測試下去。最後得到了資料庫DVWA中表users的所有欄位,user_id,first_name,last_name,user,password,avatar,last_login,failed_login。

14、已知資料庫DVWA中表users的所有欄位。現在可以下載表中的資料了。在文字框中輸入1' union select 1,group_concat(user_id, first_name, last_name, password, avatar, last_login, failed_login) from users#,返回的結果如圖4-32所示。

圖4-32  獲取表資料

如果需要處理其他的表,按照這個順序重新處理一遍就可以了。

有興趣的歡迎一起讀這本書《11招玩轉網路安全——用Python,更安全》