網路應用程式安全指南/檔案上傳漏洞
Web 伺服器應用特定的標準(例如副檔名)來決定如何處理檔案。如果應用程式允許檔案上傳(例如用於個人資料圖片、附件文件),請確保上傳的檔案不能被 Web 伺服器解釋為指令碼檔案。否則,攻擊者可能會在您的應用程式的程式語言中上傳指令碼,並透過請求上傳的檔案來執行其中包含的任意程式碼。
此外,攻擊者可以上傳自定義 HTML 或 JavaScript 檔案,並引導受害者訪問它們。由於它們來自您的應用程式內的目錄,這可用於繞過受害者瀏覽器中的同源策略保護,例如竊取 Cookie。一些有缺陷的瀏覽器(特別是 Internet Explorer)在某些情況下會忽略檔案的 MIME 型別,並根據檔案內容檢測檔案型別。
為防止此類攻擊
- 避免不必要的檔案上傳
- 確保使用者上傳的檔案不能被 Web 伺服器解釋為指令碼檔案,例如透過檢查副檔名(或您的 Web 伺服器用於識別指令碼檔案的任何方法)
- 確保檔案不能上傳到非預期目錄(目錄遍歷)
- 嘗試停用上傳目錄中的指令碼執行
- 確保副檔名與檔案內容的實際型別匹配
- 如果只允許上傳影像,請考慮使用安全庫重新壓縮它們,以確保它們有效
- 確保上傳的檔案在傳遞給使用者時使用正確的 Content-type 指定
- 使用允許的檔案型別白名單,防止使用者上傳有問題的檔案型別,例如 HTML、CSS、JavaScript、XML、SVG 和可執行檔案
- 防止使用者上傳特殊檔案(例如 .htaccess、web.config、robots.txt、crossdomain.xml、clientaccesspolicy.xml)
- 防止使用者覆蓋應用程式檔案
- 考慮使用“Content-disposition: attachment”標題傳遞上傳的檔案
基本原理
檔案上傳功能很難正確保護。如果提供它們是為了支援“噱頭”功能,它們可能不值得冒這個風險。
至關重要的是,Web 伺服器不會嘗試將上傳的檔案解釋為指令碼,因為這會導致任意程式碼執行。確保使用與您的 Web 伺服器相同的方法來決定是否將檔案解釋為指令碼。
目錄遍歷攻擊可能允許攻擊者覆蓋應用程式或伺服器檔案。防止這些攻擊也是必要的,以確保為上傳目錄停用指令碼執行實際上是有效的。
停用指令碼執行可確保如果攻擊者設法上傳指令碼檔案,它仍然不會被執行。但是,不應依賴於此:如果應用程式被轉移到不同的伺服器,該設定可能會丟失。
不匹配的檔名/副檔名可用於上傳禁止的資料型別(例如 HTML、XML、SVG - 見下文)。即使伺服器根據副檔名設定 Content-type,一些瀏覽器也可能會忽略這一點,分析檔案內容(MIME 嗅探)並將檔案解析為 HTML。
重新壓縮影像可確保任何惡意內容都被破壞。但是,影像處理庫需要是安全的,因為它會暴露於使用者內容,並可能被攻擊,例如使用緩衝區溢位漏洞。
在傳遞檔案時指定正確的 Content-type 可確保大多數瀏覽器能正確處理該檔案。這對於正確功能是必需的,但對於安全性也很重要,因為對檔案的錯誤處理會導致 MIME 嗅探,從而導致安全問題。
使用者上傳的 HTML、CSS、JavaScript 和類似檔案可能包含在網站來源中執行的指令碼,因此可以訪問 Cookie 或網站內容。XML 和 SVG 檔案經常被忽視,但也可以執行指令碼。這會導致各種攻擊,例如會話竊取、CSRF 等。可執行檔案可能對使用者構成危險,因此應予以阻止。應使用白名單,因為建立可靠且完整的危險副檔名列表是不可能的。ZIP 檔案可能對過時的瀏覽器(特別是 Firefox 2.x)構成危險。請注意,各種檔案在技術上也是 ZIP 檔案,特別是來自 OpenOffice 的文件(例如 odt、ods)和 Microsoft Office 2007 及更高版本(例如 docx、xlsx)。
像 .htacces、web.config、robots.txt、crossdomain.xml 和 clientaccesspolicy.xml 這樣的特殊檔案可能允許攻擊者更改安全設定(.htaccess、web.config)、造成負載(robots.txt)或使用外掛允許跨站點指令碼/跨站點請求偽造攻擊(crossdomain.xml 和 clientaccesspolicy.xml)。請注意,crossdomain.xml 檔案如果出現在子目錄中也是有效的。
允許使用者覆蓋屬於應用程式的檔案不僅會損壞應用程式,還會允許其他攻擊,例如使程式碼執行成為可能,或允許攻擊者更改關鍵設定。
Content-disposition: attachment 標題迫使瀏覽器儲存檔案,而不是立即開啟它,從而降低了某些攻擊的風險。請注意,這可能會極大地惹惱使用者,並且並非所有情況下都可行。
以下資源提供有關此主題的更多資訊