DDoS攻擊--CC攻擊防護詳解(HTTP)
前言
HTTP 中文名稱為超文字傳輸協議,常被用於 Web 服務請求和響應資料的傳輸。常見的 HTTP 請求有 GET 請求和 POST 請求兩種。通常,GET 請求用於從 Web 伺服器獲取資料和資源,例如請求頁面、獲取圖片和文件等;
POST 請求用於向 Web 伺服器提交資料和資源,例如傳送使用者名稱/密碼、上傳檔案等。在處理這些 HTTP 請求的過程中,Web 伺服器通常需要解析請求、處理和執行服務端指令碼、驗證使用者許可權並多次訪問資料庫,這會消耗大量的計算資源和 IO 訪問資源。
CC攻擊原理
HTTP Flood 俗稱CC攻擊(Challenge Collapsar)是DDOS(分散式拒絕服務)的一種,前身名為Fatboy攻擊,也是一種常見的網站攻擊方法。是針對 Web 服務在第七層協議發起的攻擊。攻擊者相較其他三層和四層,並不需要控制大量的肉雞,取而代之的是通過埠掃描程式在網際網路上尋找匿名的 HTTP 代理或者 SOCKS 代理,攻擊者通過匿名代理對攻擊目標發起HTTP 請求。匿名代理伺服器在網際網路上廣泛存在。因此攻擊容易發起而且可以保持長期高強度的持續攻擊,同樣可以隱藏攻擊者來源避免被追查。
HTTP/CC 攻擊的特點:
- HTTP/CC 攻擊的 ip 都是真實的,分散的
- HTTP/CC 攻擊的資料包都是正常的資料包
- HTTP/CC 攻擊的請求都是有效請求,且無法拒絕
- HTTP/CC 攻擊的是網頁,伺服器可以連線,ping 也沒問題,但是網頁就是訪問不了
- 如果 IIS 一開,伺服器很快就死,容易丟包。
那如何造成更大的殺傷呢。Web 服務與 DNS 服務類似,也存在快取機制。如果攻擊者的大量請求命中了伺服器快取,那麼這種攻擊的主要作用僅體現在消耗網路頻寬資源上,對於計算和 IO 資源的消耗是非常有限的。因此,高效的 HTTP/CC 攻擊 應不斷髮出針對不同資源和頁面的 HTTP 請求,並儘可能請求無法被快取的資源( 如關鍵詞搜尋結果、使用者相關資料等 ),這樣才能更好的加重伺服器的負擔,達到理想的攻擊效果。當然 HTTP/CC 攻擊 也會引起嚴重的連鎖反應,不僅僅是直接導致被攻擊的 Web 前端響應緩慢,還間接攻擊到後端的 Java 等業務層邏輯以及更後端的資料庫服務,增大它們的壓力,HTTP/CC 攻擊 產生的海量日誌資料甚至會對日誌儲存伺服器都帶來影響。
如果 Web 伺服器支援 HTTPS,那麼進行 HTTPS 洪水攻擊是更為有效的一種攻擊方式。原因有二:
- 其一,在進行 HTTPS 通訊時,Web 伺服器需要消耗更多的資源用來認證和加解密。
- 其二,目前一部分防護裝置無法對 HTTPS 通訊資料流進行處理,會導致攻擊流量繞過防護裝置,直接對 Web 伺服器造成攻擊。
CC攻擊防禦
攻擊靠演技,防護當然是靠火眼精睛叻。
防禦思路
HTTP/CC 攻擊 防禦主要通過快取的方式進行,儘量由裝置的快取直接返回結果來保護後端業務。當高階攻擊者穿透快取時,清洗裝置會截獲 HTTP 請求做特殊處理。因為CC攻擊通過工具軟體發起,而普通使用者通過瀏覽器訪問,這其中就會有某些區別。想辦法對這二者作出判斷,選擇性的遮蔽來自機器的流量即可。
初級
普通瀏覽器發起請求時,除了要訪問的地址以外,Http頭中還會帶有Referer,UserAgent等多項資訊。遇到攻擊時可以通過日誌檢視訪問資訊,看攻擊的流量是否有明顯特徵,比如固定的Referer或UserAgent,如果能找到特徵,就可以直接遮蔽掉了。
中級
如果攻擊者偽造了Referer和UserAgent等資訊,那就需要從其他地方入手。攻擊軟體一般來說功能都比較簡單,只有固定的發包功能,而瀏覽器會完整的支援Http協議,我們可以利用這一點來進行防禦。
首先為每個訪問者定義一個字串,儲存在Cookies中作為Token,必須要帶有正確的Token才可以訪問後端服務。當用戶第一次訪問時,會檢測到使用者的Cookies裡面並沒有這個Token,則返回一個302重定向,目標地址為當前頁面,同時在返回的Http頭中加入set cookies欄位,對Cookies進行設定,使使用者帶有這個Token。
客戶端如果是一個正常的瀏覽器,那麼就會支援http頭中的set cookie和302重定向指令,將帶上正確的Token再次訪問頁面,這時候後臺檢測到正確的Token,就會放行,這之後使用者的Http請求都會帶有這個Token,所以並不會受到阻攔。
客戶端如果是CC軟體,那麼一般不會支援這些指令,那麼就會一直被攔在最外層,並不會對伺服器內部造成壓力。
高階
高階一點的,還可以返回一個網頁,在頁面中嵌入JavaScript來設定Cookies並跳轉,這樣被偽造請求的可能性更小
Token生成演算法:Token需要滿足以下幾點要求
- 每個IP地址的Token不同
- 無法偽造
- 一致性,即對相同的客戶端,每次生成的Token相同
Token隨IP地址變化是為了防止通過一臺機器獲取Token之後,再通過代理服務區進行攻擊。一致性則是為了避免在伺服器端需要儲存已經生成的Token。
推薦使用以下演算法生成Token,其中Key為伺服器獨有的保密字串,這個演算法生成的Token可以滿足以上這些要求:
Token = Hash( UserAgent + client_ip + key )
總結:
- 早期的方法是對源 IP 的 HTTP 請求頻率設定閾值,高於既定閾值的 IP 地址加入黑名單。這種方法過於簡單,容易帶來誤殺,並且無法遮蔽來自代理伺服器的攻擊,因此逐漸廢止,取而代之的是基於 JavaScript 跳轉的人機識別方案。
- HTTP Flood 是由程式模擬 HTTP 請求,一般來說不會解析服務端返回資料,更不會解析 JS之類程式碼。因此當清洗裝置截獲? HTTP 請求時,返回一段特殊 JavaScript 程式碼,正常使用者的瀏覽器會處理並正常跳轉不影響使用,而攻擊程式會攻擊到空處。 由於 HTTP/CC 攻擊 的偽裝方式千變萬化,很少有策略或者硬體防護能做到完美清洗,所以,針對 HTTP/CC 攻擊,我們大多時候需要具備一定技術的網路維護人員進行見招拆招。
簡易CC攻擊防禦方法
1. 利用Session做訪問計數器:
利用Session針對每個IP做頁面訪問計數器或檔案下載計數器,防止使用者對某個頁面頻繁重新整理導致資料庫頻繁讀取或頻繁下載某個檔案而產生大額流量。(檔案下載不要直接使用下載地址,才能在服務端程式碼中做CC攻擊的過濾處理)
2. 把網站做成靜態頁面:
大量事實證明,把網站儘可能做成靜態頁面,不僅能大大提高抗攻擊能力,而且還給駭客入侵帶來不少麻煩,至少到現在為止關於HTML的溢位還沒出現,看看吧!新浪、搜狐、網易等入口網站主要都是靜態頁面,若你非需要動態指令碼呼叫,那就把它弄到另外一臺單獨主機去,免的遭受攻擊時連累主伺服器。
3. 增強作業系統的TCP/IP棧
Win2000和Win2003作為伺服器作業系統,本身就具備一定的抵抗DDOS攻擊的能力,只是預設狀態下沒有開啟而已,若開啟的話可抵擋約10000個SYN攻擊包,若沒有開啟則僅能抵禦數百個,具體怎麼開啟,自己去看微軟的文章吧!《強化 TCP/IP 堆疊安全》。也許有的人會問,那我用的是Linux和FreeBSD怎麼辦?很簡單,按照這篇文章去做吧!《SYN Cookies》。
4. 在存在多站的伺服器上,嚴格限制每一個站允許的IP連線數和CPU使用時間
這是一個很有效的方法。CC的防禦要從程式碼做起,其實一個好的頁面程式碼都應該注意這些東西,還有SQL注入,不光是一個入侵工具,更是一個DDOS缺口,大家都應該在程式碼中注意。舉個例子吧,某伺服器,開動了5000線的CC攻擊,沒有一點反應,因為它所有的訪問資料庫請求都必須一個隨機引數在Session裡面,全是靜態頁面,沒有效果。突然發現它有一個請求會和外面的伺服器聯絡獲得,需要較長的時間,而且沒有什麼認證,開800線攻擊,伺服器馬上滿負荷了。程式碼層的防禦需要從點點滴滴做起,一個指令碼程式碼的錯誤,可能帶來的是整個站的影響,甚至是整個伺服器的影響!
5. 伺服器前端加CDN中轉
(免費的有百度雲加速、360網站衛士、加速樂、安全寶等),如果資金充裕的話,可以購買高防的盾機,用於隱藏伺服器真實IP,域名解析使用CDN的IP,所有解析的子域名都使用CDN的IP地址。此外,伺服器上部署的其他域名也不能使用真實IP解析,全部都使用CDN來解析。
另外,防止伺服器對外傳送資訊洩漏IP地址,最常見的情況是,伺服器不要使用傳送郵件功能,因為郵件頭會洩漏伺服器的IP地址。如果非要傳送郵件,可以通過第三方代理(例如sendcloud)傳送,這樣對外顯示的IP是代理的IP地址。
總之,只要伺服器的真實IP不洩露,10G以下小流量DDOS的預防花不了多少錢,免費的CDN就可以應付得了。如果攻擊流量超過20G,那麼免費的CDN可能就頂不住了,需要購買一個高防的盾機來應付了,而伺服器的真實IP同樣需要隱藏
簡易CC攻擊防禦策略
確定Web伺服器正在或者曾經遭受CC攻擊,那如何進行有效的防範呢?
(1).取消域名繫結
一般cc攻擊都是針對網站的域名進行攻擊,比如我們的網站域名是“www.abc.com”,那麼攻擊者就在攻擊工具中設定攻擊物件為該域名然後實施攻擊。 對於這樣的攻擊我們的措施是取消這個域名的繫結,讓CC攻擊失去目標。
(2).域名欺騙解析
如果發現針對域名的CC攻擊,我們可以把被攻擊的域名解析到127.0.0.1這個地址上。我們知道127.0.0.1是本地迴環IP是用來進行網路測試的,如果把被攻擊的域名解析到這個IP上,就可以實現攻擊者自己攻擊自己的目的,這樣他再多的肉雞或者代理也會宕機,讓其自作自受。
(3).更改Web埠
一般情況下Web伺服器通過80埠對外提供服務,因此攻擊者實施攻擊就以預設的80埠進行攻擊,所以,我們可以修改Web埠達到防CC攻擊的目的。執行IIS管理器,定位到相應站點,開啟站點“屬性”面板,在“網站標識”下有個TCP埠預設為80,我們修改為其他的埠就可以了。
(4).遮蔽IP
我們通過命令或在檢視日誌發現了CC攻擊的源IP,就可以在防火牆中設定遮蔽該IP對Web站點的訪問,從而達到防範攻擊的目的。
End