前段時間上海一家遊戲娛樂公司的網站遭到了基于頁面請求的DDOS分布式拒絕服務攻擊,網站陷入完全癱瘓狀态,并被黑客的匿名信勒索,金額高達10萬元,而在勒索過程中,這群黑客還表示會對騰訊QQ等網站下手,随後QQ“伺服器維護”幾天.12月5号的時候,全球BitTorrent伺服器也受到了很強烈的DDOS攻擊,一度陷入癱瘓。而DDOS攻擊中最流行的也是威力最大的就是基于頁面的DDOS以及将這個攻擊理論發揮得淋漓盡緻的攻擊工具CC,本文特邀CC作者和我們共同了解CC的相關攻擊原理和防範方法,希望能讓更多的朋友了解這樣的攻擊方式并能防範它。
很多朋友都知道木桶理論,一桶水的最大容量不是由它最高的地方決定的,而是由它最低的地方決定,伺服器也是一樣,伺服器的安全性也是由它最脆弱的地方決定的,最脆弱的地方有多危險伺服器就有多危險。DDOS也是一樣,隻要你的伺服器存在一個很耗資源的地方,限制又不夠,就馬上成為别人DDOS的對象.比如SYN-FLOOD,它就是利用伺服器的半連接配接狀态比完全連接配接狀态更耗資源,而SYN發動方隻需要不停的發包,根本不需要多少資源。
一個好的DDOS攻擊必須是通過自己極少資源的消耗帶來對方較大的資源消耗,否則比如ICMP-FLOOD和UDP-FLOOD都必須和别人一樣大的帶寬,對方伺服器消耗多少資源自己也得賠上多少資源,效率極其低下,又很容易被人發現,現在基本沒有什麼人用了。
攻擊原理
CC主要是用來攻擊頁面的.大家都有這樣的經曆,就是在通路論壇時,如果這個論壇比較大,通路的人比較多,打開頁面的速度會比較慢,對不?!一般來說,通路的人越多,論壇的頁面越多,資料庫就越大,被通路的頻率也越高,占用的系統資源也就相當可觀,現在知道為什麼很多空間服務商都說大家不要上傳論壇,聊天室等東西了吧。
一個靜态頁面不需要伺服器多少資源,甚至可以說直接從記憶體中讀出來發給你就可以了,但是論壇就不一樣了,我看一個文章,系統需要到資料庫中判斷我是否有讀讀文章的權限,如果有,就讀出文章裡面的内容,顯示出來——這裡至少通路了2次資料庫,如果資料庫的體積有200MB大小,系統很可能就要在這200MB大小的資料空間搜尋一遍,這需要多少的CPU資源和時間?如果我是查找一個關鍵字,那麼時間更加可觀,因為前面的搜尋可以限定在一個很小的範圍内,比如使用者權限隻查使用者表,文章内容隻查文章表,而且查到就可以馬上停止查詢,而搜尋肯定會對所有的資料進行一次判斷,消耗的時間是相當的大。
CC就是充分利用了這個特點,模拟多個使用者(多少線程就是多少使用者)不停的進行通路(通路那些需要大量資料操作,就是需要大量CPU時間的頁面)。很多朋友問到,為什麼要使用代理呢?因為代理可以有效地隐藏自己的身份,也可以繞開所有的防火牆,因為基本上所有的防火牆都會檢測并發的TCP/IP連接配接數目,超過一定數目一定頻率就會被認為是Connection-Flood。
使用代理攻擊還能很好的保持連接配接,我們這裡發送了資料,代理幫我們轉發給對方伺服器,我們就可以馬上斷開,代理還會繼續保持着和對方連接配接(我知道的記錄是有人利用2000個代理産生了35萬并發連接配接)。
可能很多朋友還不能很好的了解,我來描述一下吧.我們假設伺服器A對Search.asp的處理時間需要0.01S(多線程隻是時間分割,對結論沒有影響),也就是說他一秒可以保證100個使用者的Search請求,伺服器允許的最大連接配接時間為60s,那麼我們使用CC模拟120個使用者并發連接配接,那麼經過1分鐘,伺服器的被請求了7200次,處理了6000次,于是剩下了1200個并發連接配接沒有被處理.有的朋友會說:丢連接配接!丢連接配接!問題是伺服器是按先來後到的順序丢的,這1200個是在最後10秒的時候發起的,想丢?!還早,經過計算,伺服器滿負開始丢連接配接的時候,應該是有7200個并發連接配接存在隊列,然後伺服器開始120個/秒的丢連接配接,我們發動的連接配接也是120個/秒,伺服器永遠有處理不完的連接配接,伺服器的CPU 100%并長時間保持,然後丢連接配接的60秒伺服器也判斷處理不過來了,新的連接配接也處理不了,這樣伺服器達到了超級繁忙狀态。
我們假設伺服器處理Search隻用了0.01S,也就是10毫秒(這個速度你可以去各個有開放時間顯示的論壇看看),我們使用的線程也隻有120,很多伺服器的丢連接配接時間遠比60S長,我們的使用線程遠比120多,可以想象可怕了吧,而且客戶機隻要發送了斷開,連接配接的保持是代理做的,而且當伺服器收到SQL請求,肯定會進入隊列,不論連接配接是否已經斷開,而且伺服器是并發的,不是順序執行,這樣使得更多的請求進入記憶體請求,對伺服器負擔更大。
當然,CC也可以利用這裡方法對FTP進行攻擊,也可以實作TCP-FLOOD,這些都是經過測試有效的。
防範方法
說了攻擊原理,大家肯定會問,那麼怎麼防禦?使用硬體防火牆我不知道如何防範,除非你完全屏蔽頁面通路,我的方法是通過頁面的編寫實作防禦。
1. 使用Cookie認證.這時候朋友說CC裡面也允許Cookie,但是這裡的Cookie是所有連接配接都使用的,是以啟用IP+Cookie認證就可以了。
2. 利用Session.這個判斷比Cookie更加友善,不光可以IP認證,還可以防重新整理模式,在頁面裡判斷重新整理,是重新整理就不讓它通路,沒有重新整理符号給它重新整理符号.給些示範代碼吧,Session:
程式代碼:
〈%
if session(“refresh”)〈〉 1 then
Session(“refresh”)=session(“refresh”)+1
Response.redirect “index.htm”
End if
%〉
這樣使用者第一次通路會使得Refresh=1,第二次通路,正常,第三次,不讓他通路了,認為是重新整理,可以加上一個時間參數,讓多少時間允許通路,這樣就限制了耗時間的頁面的通路,對正常客戶幾乎沒有什麼影響。
3. 通過代理發送的HTTP_X_FORWARDED_FOR變量來判斷使用代理攻擊機器的真實IP,這招完全可以找到發動攻擊的人,當然,不是所有的代理伺服器都發送,但是有很多代理都發送這個參數.詳細代碼:
程式代碼:
〈%
Dim fsoObject
Dim tsObject
dim file
if Request.ServerVariables("HTTP_X_FORWARDED_FOR")="" then
response.write "無代理通路"
response.end
end if
Set fsoObject = Server.CreateObject("Scripting.FileSystemObject")
file = server.mappath("CCLog.txt")
if not fsoObject.fileexists(file) then
fsoObject.createtextfile file,true,false
end if
set tsObject = fsoObject.OpenTextFile(file,8)
tsObject.Writeline Request.ServerVariables("HTTP_X_FORWARDED_FOR")
&"["&Request.ServerVariables("REMOTE_ADDR")&"]"&now()
Set fsoObject = Nothing
Set tsObject = Nothing
response.write "有代理通路"
%〉
這樣會生成CCLog.txt,它的記錄格式是:真實IP [代理的IP] 時間,看看哪個真實IP出現的次數多,就知道是誰在攻擊了.将這個代碼做成Conn.asp檔案,替代那些連接配接資料庫的檔案,這樣所有的資料庫請求就連接配接到這個檔案上,然後馬上就能發現攻擊的人。
4. 還有一個方法就是把需要對資料查詢的語句做在Redirect後面,讓對方必須先通路一個判斷頁面,然後Redirect過去。
5. 在存在多站的伺服器上,嚴格限制每一個站允許的IP連接配接數和CPU使用時間,這是一個很有效的方法。
CC的防禦要從代碼做起,其實一個好的頁面代碼都應該注意這些東西,還有SQL注入,不光是一個入侵工具,更是一個DDOS缺口,大家都應該在代碼中注意.舉個例子吧,某伺服器,開動了5000線的CC攻擊,沒有一點反應,因為它所有的通路資料庫請求都必須一個随機參數在Session裡面,全是靜态頁面,沒有效果.突然發現它有一個請求會和外面的服
