[小菜一碟] 化被動為主動向爬蟲投擲炸彈(Gzip Bomb)

有一天在粉絲團的一篇爬蟲相關的貼文留言中,我們的 Dino 大神有提到可以給爬蟲一個 Zip Bomb,從 User-Agent 推測爬蟲是用 Wget 打過來的,於是乎我開始著手研究塞一個 Zip Bomb 給 Wget 的可能性,看它會不會如實下載下來執行解壓縮?

我預想的流程是這樣的,我準備好一個 Zip Bomb 檔案,給爬蟲的回應是 Redirect 到下載這個 Zip Bomb 檔案的網址,並且在 Response Headers 裡面加上指定的 Content-EncodingContent-Type,看看 Wget 會不會根據回應的 Content-Encoding 及 Content-Type 在下載好檔案之後執行解壓縮? 如果會,那應該能暫時將爬蟲擊退。

我開始在網路上搜尋「Zip Bomb」,找到了幾個現成已經做好的 Zip Bomb 檔,不過這些檔案都有一個問題,雖然它們是用通用的 DEFLATE 演算法壓縮而成的,但是它們其實是多個檔案壓縮成一個檔案,這種類似於資料夾型式的 HTTP 內容,沒有合適對應的 Content-Type,我試了一下用 application/octet-stream,但是瀏覽器只是將整個壓縮檔下載下來而已,並沒有對內容執行解壓縮,所以我得另尋他法。

製作 Gzip Bomb

然後我就在網路找到了一篇 How to defend your website with ZIP bombs?,裡面有說明如何製作一個 Gzip Bomb,很簡單,只要在 Linux 的機器上,用管理員身份執行下面的指令,就能做出一個只有 10MB 大小的 10GB Gzip Bomb。

dd if=/dev/zero bs=1M count=10240 | gzip > 10g.gzip

參數可以調整,壓縮比大約就是 1MB:1GB,那它解壓縮出來的內容是一堆 ASCII 的 NULL 值,所以我們的 Content-Type 就可以用 text/htmltext/plain 來回應。

試爆 Gzip Bomb

在向指定的爬蟲投擲之前,先來試爆一下,我準備了一個爆炸威力 1MB 的 Gzip Bomb 要來試爆看看,重點要確認兩件事情:

  1. 爬蟲有處理轉址
  2. 爬蟲有將網頁內容解壓縮

由於我不知道爬蟲 Wget 的參數是怎麼下的?但是從它連 User-Agent 都沒有改的情況下,我推測它的參數是保持在預設值,所以我在 Linux 上將 Wget 安裝起來,試著直接去打目標網址,結果從下圖可以看到轉址成功,而且網頁內容也被解壓縮存放在家目錄。

所以,後續如果爬蟲有如我們預期的去處理 Request,即使記憶體不爆,硬碟應該也會爆才是,不過這個有觸犯妨害電腦使用罪的嫌疑,下手之前最好諮詢一下法律相關人士,畢竟敵暗我明。

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學