用 JavaScript 對抗 DDOS 攻擊 (下)

發表於2016-03-08

上一篇:http://web.jobbole.com/85253/

對抗 v2

之前的那些奇技淫巧,純屬娛樂而已,並不能撐多久。

但簡單、好玩,似乎這正是對抗的樂趣。之前從未想過,居然還能把指令碼黑科技,用在網路防禦上。

於是,又陸陸續續對抗了一段時間。

直到興致淡卻,懶得再頻繁升級了,於是換上一個更復雜的指令碼。其中打包了大量的演算法庫,光是程式碼,就能嚇退一些密集恐懼症者。

此外,還暗藏了一些自檢功能,干擾指令碼的分析破解。

這時,要把指令碼邏輯移植出來,就格外困難了。

這迫使攻擊者,不得不用另一種方式。。。

對抗 v3

為何要破解指令碼,為何要了解其中的細節?直接讓攻擊器執行指令碼,不就可以了!

之前擔心的,還是發生了。升級後的攻擊器,居然會彈網頁了,看起來和正常使用者一樣。。。

黑盒攻擊!加密混淆那些都沒用了,只能尋找一些破綻。開始收集區分“真網頁”和“內嵌網頁”的黑魔法。

例如,有些攻擊者為了隱蔽,把網頁彈在螢幕之外。因此,分析頁面 screenLeft、screenTop 就可以識破。

例如,內嵌網頁的尺寸是鎖定的。而彈出的網頁,沒準能調整大小,可以改變一兩個畫素試試。

…..

於是,光座標尺寸,就扛了一陣子。


事實上,大多攻擊者都不注重細節。所以,破綻還是不少的。

不過,發現破綻後怎麼處理?直接在前端中止嗎?當然不是,這樣太明顯。

即使識破,仍會傳送請求,仍能進白名單。只是,請求裡悄悄做了標記,暗示這是一個可疑使用者 —— 最終白名單的有效時間,比正常短得多。

這樣,就把測試效果延後了,增加破解時間。


同時,升級了防火牆策略,增加了“黑名單”機制。黑名單的 IP,是永遠不能變白的。

因此,某些使用者的可疑值積累到一定程度,就直接拉黑了。

隨著防火牆裝機量增加,將黑名單進行了共享,避免了不少重複分析。

對抗 v4

前端的祕密,早晚會被發現的。

最後,逼迫攻擊器也採用了“內嵌網頁”!之前的黑魔法,又紛紛失效了。。。

然而,破綻總還是有的。

很多攻擊器,程式介面是隱藏的。這,會導致一些渲染上的差異。

例如,Flash 就有這麼個機制:當介面不可見時,幀率會降到 2 fps,以節省開銷。

例如,複雜的 JS 動畫特效,原本跑的並不流暢。但介面擋住後,就能毫無壓力的執行。

…..

當然,這些只能用來參考,並非一定正確。

同時,對防火牆的策略也進行了調整:只有當機器壓力大時,才開啟攔截。儘量降低被“黑科技”誤傷的可能。

就這樣,修修補補又一年。

對抗 v5

Chrome 瀏覽器流行後,極大激發了人們研究前端的熱情。同時,指令碼除錯也變得更容易了。

為了不喪失最後的優勢,決定“反其道而行之” —— 將指令碼的部分邏輯,換成了 VBScript,迫使停留在 IE 上。

同時還將一些功能,做到了 Flash 裡。

整個流程,需要 JS、VBS、Flash、iframe 等互動才能完成,大幅增加了除錯複雜度。

對抗 v6

在對抗窘迫時,甚至還嘗試了一些下策。例如,彈出一個對話方塊:

只有點了確定,才能繼續執行。於是,一些假人就卡死在了這裡。

當然,攻擊者很快做出回應 —— 遮蔽了對話方塊。

這是如何知道的呢?因為每次對話方塊,都記錄了停頓時間:

然而這其中,居然有 0ms 的!!!

最終,將過短的時間都 XXX

對抗 v7

一段時候後,攻擊者也摸索出了規律,不直接遮蔽了。

先讓它彈出來,延時幾秒,再傳送Enter鍵去關閉。。。反正我都想到了,人家也想得到。

後來,還嘗試彈出兩個、三個、隨機個對話方塊,而對方也許只會點一次。

當然,這都是臨時的搞笑方案。

。。。

最後,迫不得己,不再使用系統對話方塊。而是用 HTML 畫一個,並且只能通過滑鼠點選關閉。

其實這早已想過,但一直不敢實施 —— 因為這只是個內嵌網頁,即使不點,也不影響程式使用。一些使用者可能沒注意到,就錯過了。

系統對話方塊沒有這個問題。因為它會阻塞整個程式的訊息,不點就無法其他操作。

為了不讓使用者錯過,這次做了一個格外醒目的浮層,並配上聲音和閃爍效果。

回到了 HTML,對抗優勢就大幅增加了。

儘管攻擊者也能模擬滑鼠點選,但是,光點選是遠遠不夠的 —— 滑鼠不可能一出來,正好就在關閉按鈕上吧,肯定還得先移進去。

因此,還統計了滑鼠 move、over、out 等事件。如果次數特別少,也是極其可疑的。

類似的行為分析方式,還有不少。配合獨特的思路,陸續更新直到最後。

其他對抗

當然,並非所有攻擊,都從指令碼著手的。

還是有不少喜歡簡單暴力的 —— 網路攻擊。尤其那臺“授權伺服器”,自然成了眾矢之的。

使用傳統的負載均衡?簡單,但不隱蔽。攻擊者只需跟蹤域名,既可遍歷出 IP。

為了隱蔽,於是將 IP 列表寫在指令碼里,讓指令碼程式來負載。而指令碼,是經過加密混淆的。

這樣,又把攻擊者帶回“前端黑魔法”這個坑裡了!

當然,執行時還是能夠觀察到,只是麻煩一些。


同時,結構上也進行一些策略優化。

例如,在遊戲伺服器上,也開了一個“授權服務”。

平時攔截未開啟時,可直接走這條“綠色通道”;只有走不通時,才通過“授權伺服器”中轉。

這樣,就大幅降低對“授權伺服器”的依賴!

當然,這麼做也有弊端:授權服務的邏輯洩露了。所以,防火牆的部分模組,也做了一些加殼處理。

結束

隨著前端技術日趨成熟,優勢大不如從前。而且對黑科技的淡卻,以及其他工作,逐漸減少了更新。

到了大學結束前,已徹底放棄了更新。

雖然其中趣事還有不少,但這是最長、最有科技的一段。不,並沒有什麼高階技術,除非“思路”也算。

前前後後絕大多數的時間,都花在“想”上面,“碼”的過程少之又少。

當然,這其中也想過一些其他型別的 “JavaScript 防火牆”,例如“跨站防火牆”、“流量劫持防火牆”等等。後來也都變成了現實,用在了工作之中。

用前端指令碼玩轉安全防禦,從那一刻起,持續至今。

相關文章