1. 程式人生 > >如何解決web系統session劫持

如何解決web系統session劫持

session劫持是一種比較複雜的攻擊方法。大部分網際網路上的電腦多存在被攻擊的危險。這是一種劫持tcp協議的方法,所以幾乎所有的區域網,都存在被劫持
可能。

兩臺主機要想進行TCP通訊,必須經過一個三次握手的過程。三次握手過程中服務端和客戶端一般會協商一個序列號。這個序列號一般是一個長整數。用來標記
每個資料包本來的順序。服務端或者客戶端使用這個序列號來重組在網路傳輸過程中亂序了的資料包。服務端和客戶端在三次握手過程中還會協商其他的內容
比如window
size用來通知對方自己可以快取多少個數據包,以防止某一方過快傳送資料包導致丟包。

下面簡述一下三次握手的過程:
假設A想要和B進行通訊。
A會先發給B一個TCP資料包。這個資料包中的SYN標誌被置位,因此又將這個資料包叫做SYN資料包。在這個資料包中會包含A的Window
size資訊,並且會包含一個ISN(Initial Sequence
Number)號,就是初始序列號ISNA。好像最初的ISN號碼固定從一個數字開始,這樣更容易被人劫持,所以後來這個數字變為了一個偽隨機數。這個值的取值範
是0到2^32-1。這個資料包中不帶負載資料。

B在收到SYN資料包後會返回一個SYN+ACK資料包,這個SYN+ACK資料包用來告訴A:
"我收到了你的SYN資料包"。同時B會將A發過來的ISNA號,原封不動地插入這個ACK資料包。並且將自己的ISNB號碼放入這個ACK資料包中返回給A。這個資料包
同樣不會帶任何的負載資料。

A收到B的ACK資料包時,同樣會返回給B一個ACK資料包表示成功收到對方的資料包。同時A也會將B傳送來的ISNA資料+1,放入這個ACK資料包返回給B。這個資料
包中可以攜帶負載資料,也可以不攜帶負載資料。(因為這時連線已經建立了)

通過上面的三次握手之後,一個完整的TCP連線就建立好了。

之後的序列號都是主機收到的資料包中的序列號+收到包中的資料大小。第三次握手中,如果ACK資料包中攜帶資料,那麼ISNA就不再是+1了。而是+資料大小。

Session Hiject

TCP協議在設計之初並沒有考慮太多安全的因素。Session都是通過客戶端IP,客戶端Port,服務端IP,服務端Port來驗證的。

session劫持一般發生在A和B建立連線之後的通訊過程中。Hacker一般會首先監聽網路上的通訊資料包。在某次通訊過程中,Hacker在B傳送資訊給A之前,假冒
B發給A一個數據包。這個資料包中使用B的IP和埠,並且將上次B收到的序列號+此資料包的資料大小作為序列號。在A收到這個資料包時,就會以為這個資料
是B發給他的。同時A會根據Hacker發給他的資料包修改自己的序列號。如果真正的B嘗試傳送資料包給A時,A會因為序列號不正確拋棄這個資料包(這時因為B沒
有收到A的響應,所以會重發這個資料包,而這個資料包在傳送到A之後又被拋棄)從此Hacker就可以代替B和A通訊了。

完成這個過程一般需要一下3個步驟:
1、監控,跟蹤某個Session通訊過程。
2、破壞Session同步通訊。
3、劫持這個Session。

下面簡述一下實現以上三個步驟的過程。
1、通過簡單的sniff就可以監聽網路上的資料包。
2、要想破壞Session同步,我們需要預測資料包的序列號。如果我們有許可權訪問網路,那就可以sniff到網路通訊過程,並且從資料包中可以計算出下個序列號
。這就是本地session劫持。如果我們沒有許可權,不可以sniff到客戶端和服務端的通訊過程,那就比較麻煩了。預測序列號是很不可能的,因為可選範圍太大
。(2^32中可能性)
   在如法預測序列號的時候,可以通過ARP欺騙的方法對客戶端和服務端來個中間人攻擊。這樣就可以使兩者之間的通訊都在Hacker的監控之下。
3、在上面兩個步驟完成之後,就只剩下重組資料包,並且傳送給通訊的某一端了。重組資料包有很多中方法和現成的工具。這裡就不說了。

有很多工具可以用來做Session劫持,有商業的,也有開源的。