網路應用安全指南/檔案包含和洩露
外觀
< 網路應用安全指南
如果要包含或傳送以響應請求的檔案的名稱來自使用者輸入(例如,在菜單系統或下載指令碼中),攻擊者可能能夠請求他們不應該獲得的檔案。如果使用者提供的名稱用於包含,這甚至會導致伺服器上的程式碼執行。
為了防止這種攻擊
- 不要從使用者輸入中獲取用於包含的檔名,只從受信任的列表或常量中獲取。
- 如果要使用使用者輸入,請針對白名單對其進行驗證。檢查檔案是否存在或輸入是否與特定格式匹配是不夠的。
- 如果可能,避免指令碼讀取和傳遞檔案。
- 如果您使用使用者提供的檔名讀取和傳遞檔案,請徹底驗證檔名以避免目錄遍歷和類似的攻擊,並確保使用者被允許讀取檔案。
- 確保應用程式以不超過所需特權執行。
原理
如果攻擊者能夠上傳指令碼檔案並讓應用程式的一部分包含它,他就可以執行任意程式碼。由於這帶來了極大的風險,因此必須仔細避免這種情況。因此,對於此任務,只有最嚴格的驗證(針對白名單進行檢查)是合適的。如果要提供檔案下載,只需將它們放在一個目錄中並讓 Web 伺服器處理其餘部分通常是最佳選擇:這不僅比讓指令碼讀取檔案更快,而且還避免了對使用者提供的檔名的風險解釋。在某些情況下,這是不可避免的,例如,如果需要指令碼來強制執行只有已登入使用者才能下載檔案,或者設定特殊標頭(參見下一節)。
在這種情況下,確保您正確執行使基於指令碼的方法成為必要的訪問檢查,並徹底驗證檔名以阻止攻擊者下載他不應該下載的檔案。您尤其需要確保攻擊者無法指定除預期檔案之外的其他檔案,尤其是不在預期目錄之外的檔案,例如,透過使用“..”偽目錄名。(請注意,一個“../”可以以多種方式編碼!)
以有限特權執行應用程式(通常透過限制 Web 伺服器或指令碼直譯器的特權來完成)可以限制這種(和其他)問題的影響。