DDoS(分散式拒絕服務攻擊)原理與防禦

2020-07-16 10:04:48
分散式拒絕服務攻擊(Distributed Denial of Service, DDoS)是一種對網站發起大量連線,導致正常使用者無法存取網站的攻擊手段。利用流量劫持變相進行 DDoS,就是 JS DDoS。

很多網站都會用 JavaScript 執行一些頁面的邏輯程式碼,它可以在網頁載入完成後再根據情況增加一些圖片元素,通過進行非同步載入提升網頁載入速度。

很多程式設計師都喜歡用網上流行的各種 JavaScript 庫,它們提供了一些公共方法,可以提升開發效率,比如一個很流行的 JavaScript 庫 jQuery,在很多網頁原始碼裡都能看到類似下文所示的程式碼。
function imgflood(){
    var TARGET = ' vi ctim-website.com'
    var URL = '/index.php?'
    var pic = new Image()
    var rand = Math.Floor(Math,random()*1000)
    pic.src = 'http://'+TARGET+URL+rand+' =val'
}
setInterval(imgflood, 10)
一個類庫越流行,就越容易被做“黑產”的人盯上:既然大家都這麼喜歡用 jQuery,就劫持開發者使用的 jQuery,然後在其中插入一段惡意的 DDoS 程式碼,當頁面載入被劫持的 jQuery 類庫後,就會觸發惡意 DDoS 程式碼的執行。

然後,每個存取這個頁面的使用者都可能成為攻擊者的傀儡機,替他們攻擊特定的網站。

下面這段程式碼展示了攻擊的雛形。
<script src="https://code.jquery.com/jquery-1.10.2.min.js" integrity="nsha256-C6CB9UYIS9UJeqinPHWTHVqh/EluhG5Tw+YqFQmYg" crossorigin="nanonymous">
這個攻擊每秒在頁面上建立 10 個圖片控制元件,每個圖片控制元件的源圖都指向 victim-websit.com,加上瀏覽器會自動拉取圖片資源,所以每個使用者每秒都會對這個網站請求 10 次,如果同時有 100 個人存取這個頁面,那麼每秒就有 1000 個無效的請求在存取 victim-websit.com,這是很大的資源浪費,而真正想存取這個網站的使用者有可能因為伺服器過載而無法開啟頁面。

當然,要防禦它是有辦法的。開發者在參照一個第三方庫時,在頁面裡寫上它的雜湊值,如果第三方庫被劫持,計算出的雜湊值與開發者寫在頁面裡的不匹配,瀏覽器便不會執行它。

還有另一種方案,就是使用 HTTPS 連結,這樣可以解決大部分劫持問題。網路世界是不安全的,需要時刻注意做好保護措施。