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

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

password nta 下載 測試 gin isp 圖像 default 下一步

以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,更安全》

技術分享圖片技術分享圖片?

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