Cookie和會話狀態的工作原理及Cookie欺騙

session是一種保存上下文信息的機制,它是針對每一個用戶的,變量的值保存在服務器端,通過SessionID來區分不同的客戶,session是以Cookie或URL重寫爲基礎。默認使用Cookie來實現,系統會創造一個名爲JSESSIONID的輸出Cookie,或稱爲"Session Cookie",以區別Persistent Cookies(通常所說的Cookie).Session Cookie是存儲在瀏覽器中,並不是寫在硬盤上的,但是把瀏覽器的Cookie禁止後,使用response對象的encodeURL或encodeRedirectURL方法編碼URL,WEB服務器會採URL重寫的方式傳遞Sessionid,用戶就可以在地址欄看到jsessionid=A09JHGHKHU68624309UTY84932之類的字符串。
 
通常Session Cookie是不能跨窗口使用,當用戶新開了一個瀏覽器進入相同的頁面時,系統會賦予用戶一個新的SessionID,這樣信息共享的目的就達不到,此時可以把SessionID保存在Persistent Cookie中,然後再新的窗口中讀出來,就可以得到上一個窗口的SessionID了,這樣通過Session Cookie和Persistent Cookie的結合,實現了跨窗口的會話跟蹤。

session的工作原理
就session的實現而言,好像是這樣的:
(1)當有Session啓動時,服務器生成一個唯一值,稱爲SessionID(好像是通過取進程ID的方式取得的)。
(2)然後,服務器開闢一塊內存,對應於該SessionID。
(3)服務器再將該SessionID寫入瀏覽器的cookie(一些在網頁的源代碼中有所體現)。
(4)服務器內有一進程,監視所有Session的活動狀況,如果有Session超時或是主動關閉,服務器就釋放該內存塊。
(5)當瀏覽器連入IIS(服務器)時並請求的ASP(腳本語言)內用到Session時,IIS(服務器)就讀瀏覽器Cookie中的SessionID。
(6)然後,服務檢查該SessionID所對應的內存是否有效。
(7)如果有效,就讀出內存中的值。
(8)如果無效,就建立新的Session。

注意:
(1)在大瀏覽量的網站,Session並不保險,我們過去的網站就經常碰到存在Session中得值不正確(可能出現重複的Session ID)。
(2)Session ID不能從硬盤上的Cookie文件獲得,如果想在客戶端獲知自己的Session ID,只能通過JavaScript來讀取。

 

Cookie和會話狀態
做BS開發,這兩個概念必不可少,先來個大概瞭解,沒有實際應用很難深入,深入看參考地址!
什麼是 Cookie?
Cookie 是一小段文本信息,伴隨着用戶請求和頁面在 Web 服務器和瀏覽器之間傳遞。用戶每次訪問站點時,Web 應用程序都可以讀取 Cookie 包含的信息。 Cookie 的基本工作原理如果用戶再次訪問站點上的頁面,當該用戶輸入 URLwww.*****.com時,瀏覽器就會在本地硬盤上查找與該 URL 相關聯的 Cookie。如果該 Cookie 存在,瀏覽器就將它與頁面請求一起發送到您的站點。

Cookie 有哪些用途?
最根本的用途是:Cookie 能夠幫助 Web 站點保存有關訪問者的信息。更概括地說,Cookie 是一種保持Web 應用程序連續性(即執行“狀態管理”)的方法.使 Web 站點記住您.

什麼是會話Session?
當用戶訪問您的站點時,服務器會爲該用戶創建唯一的會話,會話將一直延續到用戶訪問結束。

 

參考地址
http://www.microsoft.com/china/MSDN/library/archives/library/dv_vstechart/html/vbtchaspnetcookies101.asp
http://support.microsoft.com/default.aspx?scid=kb;en-us;307598

 

cookie欺騙原理

正如我們所知道的,在網絡詞彙中,cookie是一個特殊的信息,雖然只是服務器存於用戶計算機上的一個文本文件,但由於其內容的不尋常性(與服務器有一定的互交性,且常會存儲用戶名,甚至口令,或是其它一些敏感信息,例如在江湖或是一些社區中,常會用cookie來保存用戶集分,等級等等)。因而成爲一些高手關注的對象,藉此來取得特殊權限,甚至攻克整個網站。以下是自己在xp,2003上做過的測試關於javascript中對cookie的應用。

一、cookie的建立

在講如何建立cookie之前,我們先來了解一下cookie的基本格式:
cookiename+cookievalue;expire=expirationdategmt;path=urlpath;domain=sitedomain
其中各項以;分開,首先是指定cookie的名稱,併爲其賦值。接下來分別是cookie的有效期,url路徑以及域名,在這幾項中,除了第一項以外,其它部分均爲可先項。

我們來看一段代碼,瞭解一下cookie究竟是怎樣建立的:
<HTML><HEAD><TITLE>Set a cookie based on a form</TITLE> 
<SCRIPT LANGUAGE=javascript>
<!--
expireDate = new Date;
expireDate.setMonth(expireDate.getMonth()+6);
userName = "" ;
if (document.cookie!="") {
userName =document.cookie.split("=")[1];
}
function nameField_onblur() {
var userName;
userName=document.myform.nameField.value;
document.cookie="userName="+userName+";expires="+expireDate.toGMTString();
alert(document.cookie);
}
//-->
</SCRIPT></HEAD>
<BODY BGCOLOR="WHITE" onLoad="document.myform.nameField.value = userName">
<form NAME="myform">
<H1>Enter your name:
<INPUT TYPE="TEXT" NAME="nameField" onBlur="return nameField_onblur()"></H1>
</form></BODY></HTML>

1,<SCRIPT LANGUAGE="java script" TYPE="TEXT/javascript">
腳本開始的標記,由此一句告訴瀏覽器以下將是javascript.
2,<!-- Hide script from older browsers
爲了防止瀏覽器不能識別腳本,而讓瀏覽器誤以爲是HTML註釋而忽略它。
3,expireDate = new Date
獲取當前日期,並存入變量expireDate中。
4,expireDate.setMonth(expireDate.getMonth()+6)
獲取當前月份值,將其加6後設置爲expireDate的月份總值部分。這意味着本cookie的有效期爲6個月。
5,if (document.cookie != "")
如果document的值不爲空,相當於檢查用戶硬盤上是否已經有了cookie。
6,userName = document.cookie.split("=")[1]
此處用到了split("=")函數,它的功能是把cookie記錄分割爲數組,cookie的名爲cookie[0],值爲cookie[1],以此類推。所以此處document.cookie.split("=")[1]返回的值是此cookie的值。在此句中將值賦給了變量userName。
7,function nameField_onblur()()
設置名爲nameField_onblur()的函數。
8,document.cookie = "userName="+userName+";expires=" + expireDate.toGMTString()
此句是將設置好的cookie寫入用戶硬盤。expireDate.toGMTString()把expireDate中的值轉換爲文本字符串,這樣才能寫入cookie中。
9,onLoad="document.myform.nameField.value = userName"
當頁面載入時,把username的值寫入文本框(如果有的話)。
10,onBlur="nameField_onblur()"
當用戶離開文本框時,onBlur調用函數nameField_onblur()。
既然我們可以建立cookie,那麼讀取也不是什麼難事,請接着往下看!

二、讀取和顯示cookie

一般來說,cookie的作者並不希望cookie被顯示出來,這是當然的!天知道里面寫了些什麼!?然而這也是我們想要讀出它的原因!~~~:D
<HTML><HEAD><TITLE>Cookie Check</TITLE></HEAD>
<BODY BGCOLOR="WHITE">
<H2>
<SCRIPT LANGUAGE=javascript> 
<!-- Hide script from older browsers
var thisCookie;
if (document.cookie == "") {
document.write("There are no cookies here");
}
else {
thisCookie = document.cookie.split(";");
for (i=0; i<thisCookie.length; i++) {
document.write("Cookie'length is " + thisCookie.length+"<br>");
document.write("Cookie name is ’"+ thisCookie[i].split("=")[0]);
document.write("’, and the value is ’"+thisCookie[i].split("=")[1]+"’<BR>");
}
}
// End hiding script -->
</SCRIPT>
</H2></BODY></HTML>

以上的便是一段讀取cookie的名字和值的腳本。上文中解釋過的語句在此不多贅述,且看有什麼新的語法:
1,thisCookie = document.cookie.split(";")[注意:並非前文中出現過的split("=")。
split(";")可以產生數組的結果,本句中,由document.cookie.split(";")來獲取cookie的值,並將這個數組賦值。
2,for (i=0; i<thisCookie.length; i++) 
設置計算器變量i的值爲0,如果其值小於thisCookie.length(thisCookie中值的個數),將i的值加1。
3,document.write("Cookie name is ’"+thisCookie[i].split("=")[0])
此句中thisCookie[i].split("=")[0]較難理解,上面的腳本中,thiscookie已經被賦值爲一個數組的值,那麼thisCookie[i]是指數組中第i個值,也就是第i個cookie,而由上文可知split("=")[0]是指cookie的名字。
這樣thisCookie[i].split("=")[0]便是第i的cookie中cookie的名字!
4,document.write("’, and the value is ’"+thisCookie[i].split("=")[1]
跟3極爲相似,即是第i個cookie中 cookie的值。
到此,我們已經熟悉瞭如何建立cookie以及它的讀取。這些也正是cookie欺騙也需要的主要技術!

三、cookie欺騙的實現

要做到cookie欺騙,最重要的是理解目標cookie中的儲值情況,並設法改變它。由上面的學習我們知道,基於cookie的格式所限,一般來說,只有在Cookie.split("=")[0]和Cookie.split("=")[1]中的值對我們纔是有用的。也就是說只需改變這兩處或是處的值即可達到我們的目的。
而在實際操作中,還得先解決另一個問題。由於受瀏覽器的內部cookie機制所限,每個cookie只能被它的原服務器所訪問!可我們總不能跑到人家服務器上操作吧!這裏就需要一個小技巧了。
在上面我們提到過cookie的格式,最後兩項中分別是它的url路徑和域名。不難想到,服務器對cookie的識別靠的就是這個!
而在平時,我們要瀏覽一個網站時,輸入的url便是它的域名,需要經過域名管理系統dns將其轉化爲IP地址後進行連接的。這其中就有一個空當。如果能在dns上做手腳,把目標域名的IP地址對應到其它站點上,我們便可以非法訪問目標站點的cookie了!
做到這一點並不難,當然我不並不是要去操縱dns,而且那也是不可能的事情。在xp,2003下的C:/WINDOWS/system32/drivers/etc,有一名爲hosts的文件,以文本方式打開後會看到這樣的格式:
127.0.0.1 lockhost #註釋
利用它,我們便可以實現域名解析的本地化!而且其優先權高於網絡中的dns!
具體使用時,只需將IP和域名依上面的格式添加,存爲hosts即可!(注意:此文件無後綴名)
到此,cookie欺騙所需的所以知識已經齊備。下面以一個“假”的例子,演示一下如何進入實戰.(不便給出真實地址,以免引起犯罪!~~~:P)
假設目標站點是www.xxx.com
www.self.com是自己的站點。(可以用來存放欺騙目標所需的文件,用來讀取和修改對方的cookie.)
首先ping出www.self.com的IP地址:
ping www.self.com
Reply from 12.34.56.78: bytes=32 time=20ms TTL=244
然後修改hosts文件如下:
12.34.56.78 www.xxx.com
並保存爲hosts。
將用來讀取cookie的頁面傳至www.self.com(腳本如二所示)。
此時連上www.xxx.com。由於我們已經對hosts動過手腳,這時來到的並不是www.xxx.com,而是www.self.com
www.xxx.com設在本地的cookie便可被讀出!~~:D
然後根據具體情況修改一的腳本,用同樣的方法,向此cookie中寫入數據。修改完畢後,恢復hosts文件,再重新進入www.xxx.com,此時已經大功告成,可享受你的hack成果了!~~~:)

編後

cookie欺騙是一種發現較早,且較難使用的hack手法,除了javascript 可以控制以外,asp等也可以用來對其進行設置。所以在此聲明,未必能對所有站點有效。但技術真實,無須置疑!

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1192449 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章