CC攻擊的防禦(一)

背景

CC攻擊發生在 TCP/IP 協議的第七層,一般方式是在很短的時間裡對網站發起大量請求,消耗目標伺服器的資源,使目標網站負載過高而不能訪問。

CC攻擊和UDP Flood, TCP SYN Flood這類位於TCP/IP第四層的攻擊相比,對自己的資源消耗更少,對伺服器的攻擊強度更高,有四兩撥千斤的效果。如果防禦不好,呵呵,一台筆記本打垮一整個伺服器集群並不是開玩笑的。

而一般人對網路攻擊是怎樣進行的,以及怎樣進行防禦了解的都不多,這也就給了攻擊者可乘之機。我這段時間在開發VeryNginx,對這部分正好有所研究。於是寫成《CC攻擊的防禦》系列文章,主要探討CC攻擊的原理,以及一些可能的防禦思路。希望能對大家有所幫助,如同在我無知的時候,互聯網上其他無私分享知識給我的人一樣。

文中描述的全部方法都已經編寫成代碼,並實際測試通過。包含在開源項目VeryNginx中。開箱即可使用,並且還包含其他諸多強大功能。

傳送門: GitHub - alexazhou/VeryNginx: A very powerful and friendly nginx base on lua-nginx-module( openresty ) which provide WAF, Control Panel, and Dashboards. 功能強大且擁有對人類友好界面的Nginx,提供防火牆,自定義行為,和統計功能

攻擊方式

為了進行防禦,我們首先要了解我們對手的攻擊方式。

通常發起CC攻擊是使用專門的攻擊工具,同時模擬成多個用戶,向目標網站發起多個請求,一般這些軟體為了防止地址被屏蔽,還內置通過代理攻擊的功能。可以通過多個代理伺服器對目標發起攻擊,使封IP的防禦方式變的失效。

防禦思路

因為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需要滿足以下幾點要求

1,每個IP地址的Token不同

2, 無法偽造

3, 一致性,即對相同的客戶端,每次生成的Token相同

Token隨IP地址變化是為了防止通過一台機器獲取Token之後,再通過代理服務區進行攻擊。一致性則是為了避免在伺服器端需要存儲已經生成的Token。

推薦使用以下演算法生成Token,其中Key為伺服器獨有的保密字元串,這個演算法生成的Token可以滿足以上這些要求。

Token = Hash( UserAgent + client_ip + key )


推薦閱讀:

CIA反取證及殺軟對抗與繞過技術匯總
罵人也是言論自由嗎?
這雞好肉! | 泡泡白話
知乎被攻擊了對黑客有什麼好處?

TAG:Nginx | 网络攻击 | 网络攻防 |