标题 : 無限檔案上傳
日期 : 2023-12-20
感謝您造訪 Lvbug.com。我們已將社群遷移到新的網路平台,遺憾的是此頁面的內容需要以程式設計方式從其先前的 wiki 頁面移植。還有一些工作要做。
描述
上傳的文件對應用程式構成重大風險。首先 許多攻擊的步驟是向要攻擊的系統取得一些程式碼。 那麼攻擊只需要找到一種方法來讓程式碼執行即可。使用 文件上傳幫助攻擊者完成第一步。
不受限制的文件上傳的後果可能會有所不同,包括 完整的系統接管、超載的檔案系統或資料庫、 將攻擊轉發到後端系統、客戶端攻擊或簡單的 污損。這取決於應用程式如何處理上傳的內容 文件,尤其是它的儲存位置。
這裡確實存在兩類問題。第一個是與 文件元數據,例如路徑和文件名。一般都會提供這些 透過傳輸,例如 HTTP 多部分編碼。這些數據可能會欺騙 應用程式覆蓋關鍵檔案或將檔案儲存在 位置不好。您必須非常仔細地驗證元數據 在使用它之前。
另一類問題與檔案大小或內容有關。範圍 這裡的問題完全取決於文件的用途。請參閱 下面的範例提供了有關文件如何被濫用的一些想法。到 為了防止這種類型的攻擊,您應該分析您的所有內容 應用程式處理文件並仔細考慮哪些處理 以及口譯員的參與。
風險因素
該漏洞影響較大,假設程式碼可 在伺服器上下文或客戶端執行。可能性 對攻擊者的偵測率很高。患病率很常見。作為 因此,此類漏洞的嚴重性很高。
檢查文件上傳模組的存取控制非常重要 正確審查風險。
伺服器端攻擊:Web 伺服器可能會因上傳而受到損害 並執行一個可以運行命令、瀏覽系統的 web-shell 文件、瀏覽本機資源、攻擊其他伺服器或利用 局部漏洞等。
客戶端攻擊:上傳惡意檔案可以使網站 容易受到客戶端攻擊,例如 XSS 或跨網站內容 劫持。
上傳的文件可能會被濫用以利用其他易受攻擊的部分 當需要同一伺服器或受信任伺服器上的檔案時的應用程式 (可能再次導致客戶端或伺服器端攻擊)
上傳的檔案可能會觸發損壞的漏洞 客戶端的庫/應用程式(例如 iPhone MobileSafari LibTIFF 緩衝區溢位)。
上傳的檔案可能會觸發損壞的漏洞 伺服器端的庫/應用程式(例如 ImageMagick 缺陷 那個叫做 ImageTragick!)。
上傳的檔案可能會在破壞即時性的情況下觸發漏洞 監測工具(例如透過解壓縮 RAR 來利用 Symantec 防毒軟體) 文件)
惡意文件,例如 Unix shell 腳本、Windows 病毒、 帶有危險公式的 Excel 檔案或反向 shell 可以 上傳到伺服器以便管理員執行程式碼 或稍後在受害者的機器上的網站管理員。
攻擊者可能能夠將網路釣魚頁面放入網站或 損壞網站。
文件儲存伺服器可能被濫用來託管有問題的文件 包括惡意軟體、非法軟體或成人內容。已上傳 文件也可能包含惡意軟體的命令和控制數據, 暴力和騷擾資訊或隱寫數據 被犯罪組織利用。
上傳的敏感文件可能會被未經授權的人存取。
文件上傳者可能會洩漏伺服器等內部訊息 錯誤訊息中的內部路徑。
例子
將 .jsp 檔案上傳到 Web 樹 – 以 Web 使用者執行 jsp 程式碼
上傳要調整大小的 .gif 檔案 – 利用圖像庫缺陷
上傳大文件-文件空間拒絕服務
使用惡意路徑或名稱上傳文件 – 覆蓋關鍵文件
上傳包含個人資料的檔案 – 其他使用者存取它
上傳包含「標籤」的檔案 – 標籤作為執行的一部分被執行 「包含」在網頁中
上傳 .rar 檔案以供防毒軟體掃描 – 在電腦上執行的命令 運行易受攻擊的防毒軟體的伺服器
對其他系統的攻擊
將 .exe 檔案上傳到網路樹 – 受害者下載木馬 執行檔
上傳受病毒感染的檔案 – 受害者的電腦被感染
上傳包含腳本 – 受害者經歷的 .html 檔案跨站點 腳本(XSS)
上傳包含 Flash 物件的 .jpg 檔案 – 受害者經歷 跨站點內容劫持。
上傳 .rar 檔案以供防毒軟體掃描 – 在電腦上執行的命令 運行易受攻擊的防毒軟體的客戶端
薄弱的保護和繞過方法
拒絕列出檔案副檔名
此保護可能會被繞過:
尋找可以在伺服器端執行的遺失擴充功能或 在客戶端可能是危險的(例如“.php5”、“.pht”、“.phtml”、 「.shtml」、「.asa」、「.cer」、「.asax」、「.swf」或「.xap」)。
在解析文件時尋找 Web 伺服器設定中的缺陷 具有雙擴展名,或透過提供敏感的 分隔符號(例如“/”或“;”)後的擴展名字元(例如 當“file.jpg”檔案包含 PHP 程式碼時,“/file.jpg/index.php” 已上傳)
在 Apache 中,可以使用 double 來執行 php 文件 擴充技術,例如“file.php.jpg”(當“.jpg”為 允許。
在IIS6(或先前的版本)中,腳本檔案可以透過以下方式執行 使用以下兩種方法之一:
透過在禁止後添加分號字符 延期並在允許的延期之前(例如 “檔案.asp;.jpg”)
透過將腳本檔案的副檔名(例如“.asp”)重新命名為 其名稱所在的資料夾中允許的副檔名(例如“.txt”) 以腳本的副檔名結尾(例如 “資料夾.asp\file.txt”)。在 Windows 中,可以 使用檔案上傳器和 ADS 建立目錄 (備用資料流)。在此方法中,檔案名稱 以“::$Index_Allocation”結尾或 “:$I30:$Index_Allocation” 讓檔案上傳器建立 目錄而不是檔案(例如 “folder.asp::$Index_Allocation”建立“folder.asp”作為 目錄)。
將多個字母更改為大寫形式以繞過大小寫 敏感規則(例如“file.aSp”或“file.PHp3”)。
使用Windows 8.3功能,可以取代現有的 文件使用其短名稱(例如“web.config”可以替換為 “web~1.con”或“.htaccess”可以替換為“HTACCE~1”)
尋找轉換為其他有用字符的字符 在文件上傳過程中。例如,當執行 PHP 時 IIS,分別是「>」、「<」和雙引號「字符 轉換為“?”、“*”和“.”可用於替換的字符 現有文件(例如“web<<”可以替換“web.config”文件)。 為了在檔案名稱中包含雙引號字符 正常的文件上傳請求,文件名在 「Content-Disposition」標題應使用單引號(例如 filename=’web”config’ 替換“web.config”檔案)。
尋找檔案名稱後的中性字符,例如尾隨空格 Windows 檔案系統中的點和點或 a 中的點和斜線字符 Linux 檔案系統。文件名末尾的這些字元將是 自動刪除(例如「file.asp … … . . .. ..」、「file.asp ”,或“file.asp”)。儘管斜線或反斜線字元也是 通常有問題的字符,在正常情況下可以忽略它們 文件上傳請求,這些字元之前的任何內容都可以算作 伺服器端的目錄名稱;也就是說,他們應該是 嘗試進行徹底的測試(例如“test.php/”或“test.php.\”)。
尋找擴展檢測技術中的缺陷。網路伺服器可以 在提供的第一個點(“.”)之後使用第一個擴展名 檔案名或使用有缺陷的演算法來偵測副檔名 沒有或有多個點字元(例如“file.txt.jpg.php”)。
在 a 之後使用控製字符,例如空字符 (0x00) 禁止的擴展和允許的擴展可能會導致繞過。 在此方法中,Null 字元之後的所有字串都將被 保存文件時被丟棄。 URL 編碼和解碼 應在文件上傳中嘗試空字符的版本 要求進行徹底的測試。
在 Windows 中使用 NTFS 備用資料流 (ADS)。在這種情況下,一個 冒號字元“:”將插入到禁止的副檔名之後,並且 在允許的之前。結果,一個空文件 將在伺服器上建立禁止的擴展名(例如 “檔案.asax:.jpg”)。稍後可能會使用其他編輯此文件 技術,例如使用其短檔名。 “::$data”模式 也可用於建立非空文件。因此,添加一個點 此模式後的字元也可能有助於進一步繞過 限制(例如“file.asp::$data。”)
替代危險時保護機制有缺陷 擴展。例如,「file.p.phphp」可能會變更為 在完成此功能後,「file.php」。
上傳檔案使用中的缺陷,例如 PHP 應用程式 使用“include”功能顯示上傳的圖像。
上述技術的組合。
擊敗 getimagesize()
getimagesize() 函數將檢查它是否是圖像並將檢查 “mime”來驗證影像類型。
不安全的配置:
<FilesMatch ".+\.ph(p([3457s]|\-s)?|t|tml)">
SetHandler application/x-httpd-php
</文件匹配>
安全配置:
<FilesMatch ".+\.ph(p([3457s]|\-s)?|t|tml)$">
SetHandler application/x-httpd-php
</文件匹配>
如果服務在不安全配置下運行,則任何一個 可以透過在 GIF 檔案中寫入註解來擊敗 getimagesize 函數。
為此,最終用戶需要在 Kali/Ubuntu 作業系統中安裝名為 ‘gifsicle’
For Kali Linux : apt-get install gifsicle
For Ubuntu : sudo apt-get install gifsicle
安裝後,以下命令將有助於在 gif 中編寫命令 文件。
gifsicle < mygif.gif -- comment "
”>輸出.php.gif
上面的命令將創建一個名為“output.php.gif”的文件,只需在文件上傳檢查時上傳該文件 脆弱性。
允許列出檔案副檔名
使用允許列表方法檢查檔案副檔名的應用程式 還需要驗證完整的檔案名稱以防止任何繞過。
應盡可能審查允許的擴展列表 還包含惡意擴充。例如,如果 清單中包含“.shtml”,應用程式可能容易受到攻擊 SSI 攻擊。
一些拒絕列表方法的繞過技術,例如 使用雙擴展也適用於這裡並且應該是 檢查過。
請求標頭中的“Content-Type”實體表示 訊息內容的網路媒體類型。有時是網頁應用程式 使用此參數可以將檔案識別為有效檔案。為了 例如,他們只接受“Content-Type”為 “文字/純文字”。
透過更改此參數可以繞過此保護 使用 Web 代理程式在請求標頭中。
使用文件類型檢測器
有時 Web 應用程式有意或無意地使用了一些 檢查檔案類型以便處理它們的函數(或 API) 更遠。例如,當應用程式調整圖像檔案的大小時,它可能會 僅在上傳非圖像檔案時顯示錯誤訊息 將它們保存在伺服器上。
如果它讀取了幾個第一個字元(或標題),那麼它可以是 透過在某些有效標頭後插入惡意程式碼來繞過或 在文件的元資料中。
在註釋部分或沒有的部分插入程式碼 對主文件的影響也可能導致繞過。
如果應用程式可以對插入的資料進行混淆或編碼 使用特定模式或簽章偵測惡意程式碼。
上傳的檔案可以被精心設計以建立惡意程式碼,以防出現以下情況 被應用程式壓縮。
其他有趣的測試案例
當已有另一個同名檔案時上傳文件 存在。這可能會顯示有趣的錯誤訊息,可能導致 資訊披露。如果以下情況可能會發現邏輯缺陷 應用程式重新命名新檔案以將其保留在伺服器上。
當另一個資料夾已存在同名時上傳文件 存在。這可能會顯示有趣的錯誤訊息,可能導致 資訊披露。
上傳名稱很長的檔案。這可能會顯示有趣的錯誤 可能導致資訊外洩的訊息。
同時多次上傳一個檔案。這可能會顯示 有趣的錯誤訊息可能會導致資訊外洩。
上傳不同格式的有效和無效文件,例如 壓縮或 XML 檔案來偵測任何可能的處理 伺服器端。
上傳名稱為「.」、「..」或「…」的檔案。例如, 在 Windows 中的 Apache 中,如果應用程式將上傳的檔案保存在 “/www/uploads/”目錄,“.” filename 將會建立一個文件 在“/www/”目錄中稱為“uploads”。
上傳可能不易刪除的文件,例如“…:.jpg” NTFS 產生“…”檔案(可以使用以下命令刪除該文件 命令列)。這可能會顯示有趣的錯誤訊息 導致資訊外洩。
在 Windows 中上傳包含無效字元的文件,例如 |<>*?”以它的名義。這可能會顯示有趣的錯誤訊息 可能導致資訊外洩。
在 Windows 中使用保留(禁止)名稱上傳文件,例如 CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、 COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8 和 LPT9。這 可能會顯示有趣的錯誤訊息,這些訊息可能會導致訊息 披露。上傳具有保留名稱的檔案可能會導致拒絕 如果應用程式保留名稱並嘗試儲存它,則服務 具有另一個擴展名(將其錯誤地檢測為現有文件)。
跨站點內容劫持問題可以透過上傳 檔案具有允許的名稱和副檔名,但包含 Flash、PDF 或 Silverlight 內容。
上傳“crossdomain.xml”或“clientaccesspolicy.xml”檔案可以 使網站容易受到跨站點內容劫持。這些 文件應上傳到網站的根目錄才能運作。 但是,「crossdomain.xml」檔案可以位於子目錄中,只要 因為它在根“crossdomain.xml”檔案中是允許的。
測試文件上傳器的重要注意事項
測試期間不要嘗試替換現有文件,除非是 可以安全地繼續。例如,替換配置文件,例如 “web.config”或“.htaccess”檔案可能導致拒絕服務 對整個網站的攻擊。
預防方法(更安全的解決方案)
為了讓Windows伺服器更加安全,非常重要 首先遵循 Microsoft 安全最佳實務。以此目的, 一些有用的連結是:
以及對開發者和網站管理員的一些特別建議:
允許上傳的文件類型應僅限於 那些對於業務功能是必要的。
切勿在沒有後綴的情況下直接接受檔案名稱及其副檔名 允許列表過濾器。
應用程式應對任何內容執行過濾和內容檢查 上傳到伺服器的檔案。文件要齊全 在提供給其他用戶之前進行掃描和驗證。如果 如有疑問,應丟棄該文件。
有必要有一個僅允許的擴展列表 Web應用程式。並且,可以從清單中選擇檔案副檔名。 例如,它可以是“select case”語法(如果有 VBScript)選擇實際檔案的檔案副檔名 擴大。
所有控製字元和 Unicode 字元都應從 檔案名稱及其副檔名,無例外。另外, 特殊字符,如「;」、「:」、「>」、「<」、「/」、「\」、 額外的「.」、「*」、「%」、「$」等應被丟棄 出色地。如果適用且不需要Unicode 字符,強烈建議僅接受字母數字 字元和只有 1 個點作為檔案名稱和 擴大;其中檔案名稱和副檔名不應該 完全為空(正規表示式: ^\[a-zA-Z0-9\]{1,200}\\.\[a-zA-Z0-9\]{1,10}$
)。
限製檔名長度。例如,最大長度 檔案名稱加上副檔名不得超過 255 個字符 (沒有任何目錄)位於 NTFS 分割區中。
建議使用演算法來確定檔名。 例如,檔案名稱可以是檔案名稱加上的雜湊值 當天的日期。
上傳的目錄不應該有任何「執行」權限,並且所有 應從這些目錄中刪除腳本處理程序。
將檔案大小限制為最大值以防止拒絕 服務攻擊(針對檔案空間或其他 Web 應用程式的功能) 例如圖像縮放器)。
限制小文件,因為它們可能導致拒絕服務 攻擊。因此,應考慮文件的最小大小。
使用跨站點請求偽造保護方法。
防止在具有相同哈希值的情況下覆蓋文件 兩個都。
在伺服器上使用病毒掃描程式(如果適用)。或者,如果 文件內容不保密,免費的病毒掃描網站 可以使用。在這種情況下,文件應該以隨機名稱存儲 首先在伺服器上沒有任何擴展,然後在病毒之後 檢查(上傳到免費病毒掃描程式網站並返回 結果),可以將其重新命名為其特定名稱和擴展名。
嘗試使用 POST 方法而不是 PUT(或 GET!)
記錄用戶的活動。然而,日誌記錄機制應該是 確保防止日誌偽造和程式碼注入本身。
如果有壓縮檔案提取功能,則壓縮檔案的內容 壓縮檔案應作為新檔案一一檢查。
如果可能的話,請考慮將文件保存在資料庫中,而不是 比在檔案系統上。
如果檔案應該保存在檔案系統中,請考慮使用隔離的 具有不同網域的伺服器來提供上傳的檔案。
文件上傳者應該只有經過身份驗證的人才可以訪問 授權使用者(如果可能)。
應從以下文件和資料夾中刪除寫入權限 上傳資料夾。上傳資料夾不應提供任何服務
確保“.htaccess”或“web.config”等設定文件 無法使用文件上傳器進行替換。確保適當 設定可忽略“.htaccess”或“web.config” 文件(如果上傳到上傳目錄中)。
確保檔案具有雙副檔名(例如“file.php.txt”) 特別是在 Apache 中無法執行。
確保上傳的文件無法被未經授權的使用者存取。
新增「內容處置:附件」和 靜態回應的「X-Content-Type-Options: nosniff」標頭 文件將保護網站免受基於 Flash 或 PDF 的跨網站攻擊 內容劫持攻擊。建議這種做法 對用戶需要下載的所有檔案執行 處理文件下載的模組。雖然這個方法 無法完全保護網站免受使用 Silverlight 的攻擊 或類似的對象,它可以降低使用 Adobe Flash 的風險 和 PDF 對象,特別是當允許上傳 PDF 文件時。
Flash/PDF (crossdomain.xml) 或 Silverlight (clientaccesspolicy.xml) 如果不使用跨域策略文件,則應將其刪除 且對 Flash 或 Silverlight 沒有業務需求 與網站通訊的應用程式。
應禁用 crossdomain.xml 的瀏覽器緩存,並且 clientaccesspolicy.xml 檔。這使得網站能夠輕鬆地 如有必要,更新文件或限制對 Web 服務的存取。 一旦客戶端存取策略文件被檢查,它仍然有效 對於瀏覽器會話來說,非快取對最終使用者的影響 是最小的。這可以作為低風險或資訊風險問題提出 基於目標網站的內容和安全性以及 策略文件的複雜性。
應審查 CORS 標頭,使其僅針對靜態或 可公開存取的資料。否則, 「Access-Control-Allow-Origin」標頭應僅包含授權的 地址。其他 CORS 標頭,例如 「Access-Control-Allow-Credentials」僅應在下列情況下使用: 必需的。 CORS 標頭中的項目,例如 “存取控制允許方法”或“存取控制允許標頭” 如果不需要,應進行審查和刪除。
參考