學到一則有點驚悚的資安知識 - ASP.NET DLL 有可能因為管理操作不當,被人從 IIS 下載外流!

我們都知道 DLL 放在 ASP.NET bin 目錄時被視為程式,跟 App_Data 一樣具有特殊性,不能透過 httq://web-server/bin/Blah.dll 方式用瀏覽器下載。如果 DLL 是被放在非 bin 目錄下呢?

網站伺服器會以 MIME 類別賦與附檔名不同的型別宣告,以協助瀏覽器正確地處理 HTTP 協定傳回的靜態檔案。至於沒有宣告 MIME 類別的附檔名,即使 URL 正確檔案存在,基於安全考量,IIS 會傳回 HTTP 404 找不到資源。之前處理自訂字型 .woff、SVG 下載時我對這點有蠻深的體驗,因此留下一個錯誤認知,基於安全 IIS 以白名單只開放確定已知且安全的附檔名可供下載,而 dll 是伺服器端專用的,當然不能下載。但,真的是這樣嗎?

在一個預設 MIME 類別設定的 IIS 做實驗,我把 NLog.dll 從 /aspnet/bin 複製到 /aspnet 目錄下:


(補充:擷圖中的 curl 參數下錯了,應該是 --ouptut 才對)

登楞! DLL 離開了 bin 目錄就失去了保護傘,變成可以任意下載的一般檔案。

檢查 IIS 設定,這才發現,.dll 在 IIS 的預設宣告是 application/ms-download:

花惹發? 再一想,啊! 這個年代 .dll 早已不是伺服器端的專利了,Blazor 的 WebAssembly 做法就是讓瀏覽器下載 .dll 回去執行,所以 IIS 允許下載 .dll 是有理由的。 (延伸閱讀:Blazor 預覽筆記,順帶一提,Blazor Assembly 已於幾天前的 Build 2020 發佈正式版。)

好,現在我們已經知道,若把原本該放在 bin 目錄 .dll 移到 bin 目錄外,若是被惡意人士猜到 URL,便能大大方方把你的 .dll 下載回家,把內部邏輯看光光,幫你 Code Review 順便找漏洞入侵,想想這有多可怕?

什麼時候最容易發生這種事?試想以下的情境,ASP.NET 網站要更新版本,想說先把 bin 備一份出錯時方便還原,而操作人員很直覺地複製貼上:

瞧,連目錄名稱都這麼經典好猜,在我心中這跟 SQL Injection 一樣是會讓網站裸奔等級的風險呀~

知道風險之後,談談怎麼避免。

  1. 守則一、不要把 bin 下的 dll 複製到網站的其他資料夾。程式上線如需備份 bin,建議放在網站目錄以外的資料夾,不想動腦,放 App_Data 也好。 如果非放在網站根目錄不可,至少也讓資料夾名稱複雜一點,像是取成「bin.backup-2020-May-28#這樣你也猜得到我叫你爸」(誤),避免被猜中。 若只是暫時性備份,不用時請立即移除。
  2. 如果確認網站沒用到 Blazor / WebAssembly,沒有讓使用者下載 dll 的需求,則可考慮修改 web.config 移除 .dll:
     <system.webServer>
         <staticContent>
             <remove fileExtension=".dll" />
         </staticContent>
     </system.webServer>   
    
    社絕犯錯風險:

這個風險讓我不禁聯想到 SQL Injection:

帶原者多半只因不了解 SQL Injection 的嚴重性,在知道真相的當下,震撼之餘,就能在瞬間產生免疫力。說到這裡,不禁回想起我接種疫苗的那一天… 當時,我還是個天真無邪的菜鳥程式師。在一個研討會中,講師介紹了 SQL Injection,並打趣地說,在竹科的場次,講完這一段,通常就有一批聽眾神色緊張地衝出會場,趕回公司改程式去了。當時,台下的我,雖然克制住打道回公司的衝動,但接連而來的是三天少吃少喝少睡的日子,將過去做過專案裡所有的 ASP、VB COM 都掃過一次,之後再找個理由通知客戶要更新程式,才算結束了這場驚魂。
【延伸閱讀】你的網站正在裸奔嗎?

希望大家看到這篇的同時也能完成疫苗接種,順便想一下,自己的網站是否有類似問題,若不幸言中,快修呀!

同場加映:把 Log 直接存在網站目錄下也存在類似風險。延伸閱讀:當心營運資訊裸奔-網站偵錯 Log 檔常犯的資安錯誤

Introduce to the risk of backup DLL downloading on IIS.


Comments

# by Lik

受教了

# by 凱大

這世界從來都不缺恐怖片 2018年這片也很驚悚 XD https://www.youtube.com/watch?v=C7D4WTLNEUQ&list=PLOETEcp3DkCrmGI9bHXMDsxl6_YdnZr7M&index=78&t=3s

# by ByTIM

換成LINQ後,就不用像以前一樣,要自己塞具(匿)名參數了!

# by Huang

IIS網站真的只存必要的東西,非必要的不要放在IIS裡的目錄,特別是透過報表程式生出來的報表檔、暫存檔。請假設(也是事實)IIS網站下的所有目錄其實是一覽無疑、包含檔案

Post a comment


39 - 33 =