【Web安全】DoS及其家族

不久前我分享過的Web安全概述獲得了大家的廣泛關注,說明大家對Web安全這一塊還是很關心的,因此木可大大將陸續推出目前常見的Web攻擊手段和對應的防範策略。本期向大家介紹的是DoS和它的家族。

DoS

DoS(Denial of Service,拒絕服務攻擊),它的原理很簡單,就是用我們手裏的機器去給服務器發請求,如果我們手頭的服務器各方面性能都比服務器的主機的性能好,那麼當我們發送大量請求給服務器,佔用服務器的資源,導致服務器沒有能力去處理其他用戶請求。

爲了加深大家的理解,我就詳細介紹DoS攻擊中最有名的實現方式:Syn-Flood攻擊。在具體介紹Syn-Flood攻擊之前,我先和大家溫故一下什麼是三次握手。所謂的三次握手,就是在建立TCP連接的時候,客戶端和服務器需要做幾次通訊,確認相互之間的信息。它是保證TCP協議可靠性的重要手段之一。下面我們就來看一下它的具體流程:

1、客戶端(Client)首先向服務器(Server)發送連接請求,請求內容是:SYN=1 Seq=X

2、服務器收到這個包以後,將這個數據放入到一個隊列中,這個隊列叫syn_table。並且發送一個返回包,作爲響應,這個返回包有自己的序列號(Seq=Y),以及一個Ack,Ack的值就是客戶端發來的Seq值加一;

3、客戶端收到返回信息以後,將服務器的Seq加一作爲Ack又發給服務器;

4、服務器收到這第三個包,驗證沒問題以後,就將這個連接放入到request_sock_queue,三次握手完成。

以上就是三次握手的具體流程。看到這裏大家可能會有個疑問,平時我們在和服務器建立連接的時候僅僅調用connect,我們並沒有進行三次握手,實際上connect這個高層概念是對三次握手的抽象,它的具體實現完成了三次握手流程。

面對TCP的三次握手協議,攻擊者應該如何發起攻擊呢?攻擊者首先故意發起一個握手數據包,服務器收到以後將它放入等待隊列,並返回確認。其次,攻擊者不再發送第3個確認包,這樣一來,服務器就會進行多次重傳發送(Linux系統通過tcp_synack_retries配置重傳次數),消耗了大量額外開銷,以及等待隊列被佔用,甚至於等待隊列被佔滿,最終導致服務器不能接收客戶端的請求。這就是Syn-Flood攻擊。

目前,我們是採取何種方法來解決Syn-Flood攻擊的呢?第一種方法,縮短等待時間,儘早刪除在等待隊列中等待非法請求數據包;第二種方法是在第一次握手報文不放入等待隊列,我們將一個32位的無符號整數作爲第二次握手的Seq返回給客戶端,該整數通過將用戶請求的參數(包括請求的地址、端口等),加上服務器的一個序列號等做了一次運算得到。如果是正常用戶,它在收到這個整數之後加1作爲ACK返回給服務器,服務器在拿到數據後,對這個ACK減1再進行逆運算得到各個參數,最後發出去的數據進行比對,如果完全一致,說明是一個有效的響應,存放到相應的數據結構,反之則不是。通過該方法,非法請求就不能佔用系統資源了。

DDoS

DDoS(Distributed Denial of Service,分佈式拒絕服務),它是DoS家族裏很難防範的一種攻擊方式,攻擊者首先控制大量肉雞,然後向目標服務器發送海量請求,導致目標服務器不可用。這裏我們不禁要問攻擊者是如何獲取大量肉雞的呢?攻擊者會對某些APP或網站植入一些惡意代碼,譬如說curl www.mukedada.com,用戶在使用這款APP或網站時,會自動請求www.mukedada.com這個網站,如果這款APP或網站的活躍用戶數很多,那麼www.mukedada.com這個網站就會受到很多莫名的請求。這就要求我們在平時上網過程中不要瀏覽一些不知名的網站和下載來源不明的APP。

針對這種攻擊方式,我們該如何防禦呢?首先,作爲用戶我們儘量從正規渠道下載APP以及文明上網,儘量不讓自己做肉雞;其次,作爲服務廠家,當服務器受到DDoS攻擊時,我們儘量提升服務器的處理能力,當我們服務器的處理能力大於攻擊者的能力時,這些攻擊對服務器就不算啥事;最後,一般情況下,我們的服務器的處理能力一般低於攻擊者的能力,針對這種情況,目前有以下幾種方法:1.暴力方式,譬如:設置訪問頻率閾值,當某個IP單位時間內訪問次數超過這個閾值就拒絕;對於某個服務,如果瞬時請求過大,選擇直接拒絕保證其他服務的正常工作;這種方式可能導致正常用戶也無法使用。2. 驗證碼,爲了防止暴露方式帶來的誤傷正常用戶,目前服務商在收到大量請求時,會向"用戶"發送驗證碼,如果是真實用戶則會輸入驗證碼,而是肉雞的話,則不會,通過該方法則分辨出真實用戶和肉雞。

DRDoS

通過上文介紹,DDos攻擊需要獲取大量的肉雞,但是獲取肉雞也越來越困難了,那目前還有沒有不用控制肉雞還能大量攻擊的呢?DRDoS((Distributed Reflection Denial of Service,分佈式反射拒絕服務),攻擊者將不是將請求直接發送給被攻擊者,而是發送給一個第三方,通過第三方中轉到被攻擊者,這就是"Reflection"的體現。它的流程具體如下:攻擊者將請求包的源IP篡改成要被攻擊者的IP,目標IP是第三方IP,那麼第三方的恢復報文的目標IP就變成被攻擊者的IP,這樣一來,被攻擊者就會收到大量請求導致服務不可用。

需要注意的是:1. 攻擊者往往選擇的是基於UDP協議的系統,因爲UDP協議是不可靠的,能夠僞造源IP; 2. 攻擊者往往會選擇那些響應包大於請求包的服務。基於此,一般被被攻擊的服務包括DNS服務、Memcached服務等。爲了加深大家理解,我就以Memecached服務爲例。首先,Memcahced運行在11211端口,支持TCP和UDP一些,也就是說攻擊者能夠僞造源IP,同時,Memcached支持最大鍵值但數據對1M存儲,意味着攻擊者用較小的請求包讓攻擊者收到變大了幾十倍的數據包。

對於這種攻擊,有沒有方法來防範呢?首先,擴大服務器的寬帶;其次,儘可能選擇TCP協議;最後,對於一些被放大的返回包直接進行丟棄。

歡迎關注微信公衆號:木可大大,所有文章都將同步在公衆號上。

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