版權聲明:本文爲博主原創文章,未經博主允許不得轉載;如需轉載,請保持原文鏈接。
HTTPS中間人攻擊及防禦
HTTPS也不是絕對安全的,在HTTPS握手的過程中,如果實施不當,還是會存在漏洞,很容被中間人攻擊;
什麼是中間人攻擊:
中間人攻擊(Man-in-the-middle attack,縮寫:MITM)是指攻擊者與通訊的兩端分別創建獨立的聯繫,並交換其所收到的數據,使通訊的兩端認爲他們正在通過一個私密的連接與對方直接對話,但事實上整個會話都被攻擊者完全控制。在中間人攻擊中,攻擊者可以攔截通訊雙方的通話並插入新的內容,達到HTTPS攻擊的目的。維基百科:
如何進行中間人攻擊的呢?
攻擊一:SSLSniff
攻擊者在網關截獲SSL會話,替換服務器公鑰證書,將公鑰PKey
換成自己的公鑰PKey
,欺騙客戶端。客戶端使用PKey
加密信息併發送會話,中間人用私鑰Skey
解密客戶端返回會話,從而劫持會話。同時,中間人用PKey
加密明文會話並返回服務器
過程如下:
Attacker
截獲了客戶端的say hello
,可以把publicKey_attacker
返回給客戶端,取得客戶端的信任,至此Attacker
與客戶端建立了安全連接。Attacker
冒充客戶端向服務器發送say hello
,至此Attacker
與服務器建立了安全連接。
這種攻擊會存在一個問題會被感知到,就是Attacker
的證書是僞造的不受信任的證書,所以客戶端可以確認是否需要真的連接該服務器,不過如果有內鬼的話,僞造的受信任的證書的話,就當我啥也沒說;
攻擊二:SSLStrip
這種攻擊相對於攻擊一複雜一點,但是也更加厲害,幾乎可以在客戶端無感知的情況下實施攻擊,並且不需要僞造證書;簡單來說就是這樣:Attacker
在客戶端與服務器建立連接時,在Attacker
與服務器之間形成HTTPS連接,而在客戶端與Attacker
之間形成HTTP
連接,即將SSL層從原HTTPS連接中“剝離”。這樣,既避免了在客戶端驗證證書時難以避免的彈框問題,又能夠劫持HTTP明文數據,並同時保證客戶端HTTP
數據的傳輸,達到欺騙服務器與客戶端的效果。
過程如下:
用戶在瀏覽器地址欄中輸入網址時,多數會採用直接輸入網址的方式,而忽略了傳輸所採用的協議。例如,在登錄gmail過程中,大多數用戶會直接在地址欄中輸入www.gmail.com
,向Google
服務器發送一個HTTP連接請求,而不是輸入https://www.gmail.com
, 向服務器發送一個HTTPS
連接請求。因此,用戶通常接觸到HTTPS的方式有兩種:一種是 Web上的連接,比如當用戶在gmail上輸入用戶名和密碼後,點擊的登錄鍵,將用戶的用戶名和密碼以HTTPS
的形式POST
到服務器。另一種是通過HTTP的302狀態。 當客戶端向gmail提出HTTP連接請求時,gmail服務器會返回一個REDIRECT
網址,https://www.google.com/accounts/ServiceLogin?service=mail...
,用戶端在接收到這個URL後,將頁面重定位到該網頁,並請求HTTPS連接。 從另外一個角度講,用戶通常是通過HTTP
向服務器發起HTTPS
連接的。而HTTP
本身是以明文的形式對外傳送,並不能保證數據的安全。因此,可以考慮通過對HTTP進行劫持,來實現對HTTPS劫持的目的。
- 客戶端向服務器發起
HTTP
連接請求; - 中間人MITM監聽客戶端與服務器的
HTTP
數據; - 服務器返回給客戶端的HTTP數據包被在客戶端與服務器之間的中間人截獲。中間人解析原HTTP數據包,將其中
<a href=”https://...”>
替換成<a href=”http//...”>
,將Location: https://...
替換成Location:http://..
,同時記錄下所修改的URL,並保存; - 中間人將修改後的
HTTP
數據發送給客戶端; - 客戶端向服務器發起
HTTP
連接請求; - 中間人計算機解析客戶端的
HTTP
連接請求,並與保存文件相比較。當發現存在有已修改過的HTTP URL
時,將其替換成原HTTPS URL
,併發送給服務器; - 與服務器保持
HTTPS
連接,回到步驟3; - 與客戶端保持
HTTP
連接,回到步驟4。
效果就是: 服務器認爲HTTPS是安全的。對於客戶端而言,由於中間人MITM與客戶端Client之間是HTTP連接,因此並不會對證書進行認證;
當然還有別的攻擊方式,這裏只着重介紹這兩種
如何防禦中間人攻擊?
中間人攻擊是一個(缺乏)相互認證的攻擊;由於客戶端與服務器之間在SSL握手的過程中缺乏相互認證而造成的漏洞
防禦中間人攻擊的方案通常基於一下幾種技術
- 公鑰基礎建設PKI
使用PKI相互認證機制,客戶端驗證服務器,服務器驗證客戶端;上述兩個例子中都是隻驗證服務器,這樣就造成了SSL握手環節的漏洞,而如果使用相互認證的的話,基本可以
-
更強力的相互認證
-
延遲測試
使用複雜加密哈希函數進行計算以造成數十秒的延遲;如果雙方通常情況下都要花費20秒來計算,並且整個通訊花費了60秒計算纔到達對方,這就能表明存在第三方中間人。
- 使用其他形式的密鑰交換形式
未完待續。。。https://blog.csdn.net/u010731949/article/details/50538280