文件上傳漏洞通常是指「上傳web腳本可以被服務器解析」的問題,也就是常說的webshell的問題,要完成這個攻擊須要知足如下幾個條件:php
繞過文件上傳檢查功能:web
Apache文件解析問題:在Apache1.x、2.x中,對文件名的解析就存在如下特性。shell
Apache對於文件名的解析是從後往前解析的,直到碰見一個Apache認識的文件類型爲止。好比瀏覽器
Phpshell.php.rar.rar.rar.rar
由於Apache不認識.rar這個文件類型,因此會一直遍歷後綴到.php,而後認爲這是一個PHP類型的文件。安全
IIS文件解析問題:IIS6在處理文件解析時,也出過一些漏洞。前面提到的0x00字符截斷文件名,在IIS和Windows環境下出現過相似的漏洞,不過截斷字符變成了分號「;」。服務器
當文件名爲abc.asp;xx.jpg時,IIS 6會將此文件解析爲abc.asp,文件名被截斷了,從而致使腳本被執行。好比:函數
http://www.target.com/path/xyz.asp;abc.jpg
除此漏洞外,ISS 6還出過一個漏洞,由於處理文件夾拓展名出錯,致使將/*.asp/目錄下全部文件都做爲ASP文件進行解析。好比:網站
http://www.target.com/path/xyz.asp;abc.jpg
設計安全的文件上傳功能:spa
1.文件上傳的目錄設置爲不可執行設計
只要web容器沒法解析該目錄下的文件,即攻擊者上傳了腳本文件,服務器自己也不會受到影響。在實際應用中,不少大型網站的上傳應用,文件上傳後會放到獨立的存儲上,作靜態文件處理。
2.判斷文件類型
在判斷文件類型時,能夠結合使用MIME Type、後綴檢查等方式。在文件類型檢查中,強烈推薦白名單的方式。此外,對於圖片的處理,可使用壓縮函數或者resize函數,在處理圖片的同時破壞圖片可能包含的HTML代碼。
3.使用隨機數改寫文件名和文件路徑
文件上傳若是要執行代碼,則須要用戶可以訪問到這個文件。若是使用隨機數改寫了文件名和路徑,將極大地增長攻擊的成本。
4.單獨設置文件服務器的域名
因爲瀏覽器同源問題策略的關係,一系列客戶端攻擊將失效。