1. 程式人生 > >應用層拒絕服務攻擊

應用層拒絕服務攻擊

數據庫 coo bsp 源地址 http post 方法 fields 實現 exp

DOS:Denial Of Service

DDOS:Distributed Denial Of Service(利用僵屍網絡——由“肉雞”組成,發起 DoS 攻擊)

常見的 DDOS 攻擊

SYN flood(經典,利用了 TCP 協議“三次握手”設計中的缺陷),UDP flood,ICMP flood 等。

SYN flood

在攻擊時首先偽造大量的源 IP,分別向服務器端發送大量的 SYN 包。此時服務器端返回 SYN/ACK 包,由於源地址是偽造的,SYN/ACK 包不會被應答。服務器端會重試 3~5次並等待一個 SYN Time(30~120秒),如果超時則丟棄連接。防禦方式:SYN Cookie(為每個 IP 地址分配一個 Cookie,並統計每個 IP 的訪問頻率。如果在段時間內收到大量的來自同一個 IP 的數據包,則認為受到攻擊,之後來自這個 IP 地址的包將被丟棄)、SYN Proxy、safereset 等算法。

在很多對抗 DDOS 的產品中,一般會綜合使用各種算法,結合一些 DDOS 攻擊的特征,對流量進行清洗。對抗 DDOS 的網絡設備可以串聯或者並聯在網絡出口處。

應用層 DDOS

不同於網絡層 DDOS,應用層 DDOS 已經完成了 TCP 的三次握手,連接已經建立,所以發起攻擊的 IP 地址都是真實的。當前的商業 Anti-DDOS 設備只在對抗網絡層 DDOS 時效果較好,而對應用層 DDOS 攻擊卻缺乏有效的作用。

CC 攻擊:Challenge Collapasar(Collapasar 是綠盟的反 DDOS 設備,能有效地清洗 SYN Flood 等有害流量),CC 攻擊的原理就是對一些消耗資源(查詢數據庫、讀寫硬盤文件等)較大的應用頁面不斷發起正常的請求,以此達到消耗服務資源的目的。

應用層 DDOS 攻擊的一種實現方式:在黑客入侵了一個流量很大的網站後,通過篡改頁面,將巨大的用戶流量分流到目標網站。比如在大流量網站上插入如下代碼:

<iframe src="http://targetSite" height=0 width=0></iframe>

一些優化服務器性能的方法能夠緩解應用層 DDOS 攻擊(提升服務能力、資源容量)。常用的防禦措施是在應用中限制每個“客戶端” 做請求頻率的限制(基於 IP、Cookie 確定客戶端,攻擊者可以使用代理服務器發起攻擊突破該限制)。

防禦應用層 DDOS

人機識別(驗證碼)是應用層防禦 DDOS 的好物,只是會影響用戶的體驗。

在 Apache 的配置中,有些參數可以緩解 DDOS,比如調小 Timeout、KeepAlive Timeout 值,增加 MaxClients 值(可能影響正常業務)。Apache 提供的模塊接口可以擴展 Apache、設計防禦措施,比如 mod_qos(限制單個 IP 地址的訪問頻率),mod_evasive。

Yahoo 的 Detecting system abuse。

資源耗盡攻擊

Slowloris 攻擊:以極低的速度往服務器發送 HTTP 請求。由於 Web Server 對於並發的連接數都有一定的上限,因此若惡意地占用這些連接不釋放,那麽 Web Server 的所有連接都將被惡意連接占用,從而無法接受新的請求,導致拒絕服務。

HTTP POST DOS:在發送 HTTP POST 包時,指定一個非常大的 Content-Length 值,然後以很低的速度發包,比如 10~100s 發送一個字節,保持住這個連接不斷開。當客戶端連接數多了以後,占用住了 Web Server 的所有可用連接,從而導致 DOS。

Server Limit DOS:Web Server 對 HTTP 包頭的長度有限制,如果客戶端發送的 HTTP 包頭超過限制,服務器將返回 4xx 錯誤。攻擊者可以通過 XSS 往客戶端寫入一個超長的 Cookie,則用戶在清空 Cookie 前將無法再訪問該 Cookie 所在域的任何頁面(Cookie 是存放在 HTTP 包頭裏發送的)。防禦:可以將 Apache 的配置參數 LimitRequestFieldSize 設置為 0 (大小不限制)。

正則表達式引發的 DOS 攻擊——ReDOS

正則表達式是基於 NFA 的一個狀態機,每個狀態和輸入符號都可能有許多不同的下一個狀態。正則解析引擎將遍歷所有可能的路徑直到最後。由於每個狀態都有若幹個“下一個狀態”,因此決策算法將逐個嘗試每種情況,直到匹配到一個路徑。如果正則表達式編寫不當,將引起解析過程變復雜,消耗計算資源。

存在 ReDOS 的正則表達式:

a++    (a+)+

charclass+ ([a-zA-Z]+)*

a_or_aa  (a|aa)+

a_or_a   (a|a?)+

a_11    (.*a){11}

a_65    (.*a){65}

Friedl    ([^\\"‘]+)*

上述表達式的變體:^expr$

OWASP  ^[a-zA-Z]+(([‘\,\.\-][a-zA-Z ])?[a-zA-Z]*)*$

DataVault  ^\[(,.*)*\]$

EntLib  ^([^"]+)(?:\\([^"]+))*$

JavaClassname  ^(([a-z])+.)+[A-Z]([a-z])+$

Cox_10  a?a?a?a?a?a?a?a?a?a?aaaaaaaaaa

Cox_25  a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaaaaaaa

ReDOS 的測試用例

a_12X  aaaaaaaaaaaaX

a_18X  a_33X  a_49X

Cox_10  aaaaaaaaaa

Cox_20  Cox25  Cox34

JavaClassname  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!

[email protected]!

[email protected]

invalid_Unicode  (.+)+\u0001

DataVault_Dos  [,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

EntLib_DoS  \\\\\\\\\\\\\\\\\\\\\\\\\\"

EntLib_DoSX  \\\\\\\\\\\\\\\\\\\\\\\\\\"X

應用層拒絕服務攻擊