SYN攻擊是駭客攻擊常用的手段,也是DDoS的方式之一。 SYN攻擊利用TCP協定缺陷,透過發送大量的半連線請求,耗費CPU和記憶體資源。 SYN攻擊除了能影響主機外,還可以危害路由器、防火牆等網路系統,事實上SYN攻擊並不管目標是什麼系統,只要這些系統打開TCP服務就可以實施。
要明白這種攻擊的基本原理,還是要從TCP連線建立的過程開始說起:
大家都知道,TCP是基於連接的,也就是說:為了在服務端和客戶端之間傳送TCP數據,必須先建立一個虛擬鏈路,也就是TCP連接,建立TCP連接的標準過程是這樣的:
第一步,請求端(客戶端)發送一個包含SYN標誌的TCP封包,SYN即同步,同步訊息會指明客戶端所使用的連接埠以及TCP連線的初始序號;
第二步,伺服器在收到客戶端的SYN封包後,將傳回一個SYN+ACK的封包,表示客戶端的請求被接受,同時TCP序號加一,ACK即確認。
第三步,客戶端也回傳一個確認封包ACK給伺服器端,同樣TCP序號加一,到此一個TCP連線完成。
以上的連接過程在TCP協定中稱為三次握手。
問題就出在TCP連線的三次握手中,假設一個用戶向伺服器發送了SYN封包後突然死機或斷線,那麼伺服器在發出SYN+ACK應答報文後是無法收到客戶端的ACK封包的(第三次握手無法完成),這種情況下伺服器端一般會重試(再次發送SYN+ACK給客戶端)並等待一段時間後丟棄這個未完成的連接,這段時間的長度我們稱為SYN Timeout,一般來說這個時間是分鐘的數量級(大約30秒-2分鐘)。
一個用戶出現異常導致伺服器的一個線程等待1分鐘並不是什麼很大的問題,但如果有一個惡意的攻擊者大量模擬這種情況,伺服器端將為了維護一個非常大的半連接列表而消耗非常多的資源----數以萬計的半連接,即使是簡單的保存並遍歷也會消耗非常多的CPU時間和內存,何況還要不斷對這個列表中的IP進行SYN+ACK的重試。
實際上如果伺服器的TCP/IP棧不夠強大,最後的結果往往是堆疊溢出崩潰---即使伺服器端的系統足夠強大,伺服器端也將忙於處理攻擊者偽造的TCP連接請求而無暇理睬客戶的正常請求。
以上是SYN如何利用TCP協定發動攻擊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!