程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Session劫持原理簡介

Session劫持原理簡介

編輯:關於JAVA
 

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劫持,有商業的,也有開源的

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved