文件上傳漏洞
用戶上傳了一個可執行的腳本文件,並通過此腳本文件獲得了執行服務器端命令的能力。
文件上傳可能存在的安全問題:
(1)上傳文件為 Web 腳本,服務器的 Web 容器解釋並執行了該腳本,導致代碼執行——webshell;
(2)上傳文件是 Flash 的策略文件 crossdomain.xml,攻擊者可以控制 Flash 在該域下的行為;
(3)上傳文件是病毒、木馬文件,攻擊者用以誘騙用戶或者管理員下載執行;
(4)上傳文件是釣魚圖片或包含了腳本的圖片,在某些版本的瀏覽器中被作為腳本執行,進而被用於欺詐。
webshell 形成的條件:
(1)上傳的文件位於 Web 容器能夠覆蓋的目錄,從而能夠被 Web 容器解釋執行;
(2)用戶能夠從 Web 上訪問這個文件,從而觸發 Web 容器解釋執行上傳的腳本;
另外,上傳的文件內容不被破壞,比如安全檢查、格式化、圖片壓縮等,確保上傳的腳本可用。
在防御文件上傳漏洞的時候切忌使用黑名單機制,因為該方法不全面、不可靠。
文件上傳中的防與攻:
(1)防:上傳時檢測文件名后綴;攻:① 構造文件名 “filename.php.合法后綴”(原理:有些服務器端從左至右檢測文件,將遇到的第一個 “.???” 作為文件后綴;有些 Web Server 對文件名的解析時從右往左解析的,直到遇見一個它認識的文件類型為止,比如 Apache);② 構造文件名 “filename.php[\0].合法后綴”(原理:在大多語言中 “0x00” 或 “\0” 是終止符(0字節截斷),這種形式的文件名可以繞過應用的上傳文件類型判斷,但對於服務器端,此文件會因為 0字節截斷的問題,最終變成 filename.php);③ 在 IIS 提供 web 服務的站點中,構造文件名 “filename1.php;filename2.合法后綴”(原理:在 IIS 和 Windows 環境下,字符 “;” 常被用作截斷字符);
(2)防:上傳時檢測文件頭;攻:偽造合法的文件頭,當 Web Server 將該文件當做腳本文件解析時攻擊成功。
(3)用戶配置未妥當配置 Web 服務系統的一些功能帶來的安全隱患:① IIS 的 WebDav 中定義的 PUT、MOVE 方法。攻擊者可以通過 OPTIONS 方法探測服務器支持的 HTTP 方法類型,如果支持 PUT,則使用 PUT 上傳一個指定的文本文件,最后通過 MOVE 改寫為腳本文件。② PHP 的 CGI 路勁解析問題:當訪問 http://www.xxx.com/path/test.jpg/notexist.php 時,會將 test.jpg 當做 PHP 進行解析,其中 notexist.php 是不存在的文件。原因是,當 PHP 的配置選項 cgi.fix_pathinfo=1 時,在映射 URI 的時候將遞歸查詢路徑確認文件的合法性。notexist.php 是不存在的,所以將往前遞歸查詢路徑,直到檢測到存在的 test.jpg 文件。此時 SCRIPT_FILENAME 為 /path/test.jpg,而 PATH_INFO 為 notexist.php,最終 test.jpg 被當做 PHP 文件進行解析。
(4)利用上傳文件釣魚:低版本的 IE 瀏覽器(IE6/7)會將圖片文件當做 HTML 進行解析,不懷好意者可以將網頁跳轉的代碼藏在圖片里,然后將圖片上傳,然后傳播該圖片。查看該圖片的用戶將被跳轉到一個惡意站點,掉進壞人的陷阱。
避免文件上傳功能帶來的安全問題
(1)文件上傳的目錄設置為不可執行;
(2)用白名單機制判斷文件類型(文件后綴、文件頭);
(3)對上傳的文件做更改文件名、壓縮、格式化等預處理;
(4)單獨設置文件服務器的域名。