什么是文件上傳漏洞
文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,並通過此腳本文件獲得了執行服務器端命令的能力。常見場景是web服務器允許用戶上傳圖片或者普通文本文件保存,而用戶繞過上傳機制上傳惡意代碼並執行從而控制服務器。
可以看出來這種攻擊的危害很大,攻擊者一旦拿到服務器權限,那必然“天下大亂”。想要預防這種攻擊必然要知道這種攻擊的原理,攻擊的方式。這樣我們才能做出更好的應對。本文就從攻擊原理
,攻擊方式
,預防方法
等方面來介紹下文件上傳漏洞。知己知彼,方能百戰不殆。
文件漏洞攻擊成功的條件
一個“可疑”文件成功上傳到后台后並不代表攻擊就成功了。還必須滿足一定的條件才能才能對后台造成攻擊:
-
首先上傳的文件能夠被Web容器解釋執行(比如php被Apache容器執行),所以文件上傳后所在的目錄要是Web容器所覆蓋到的路徑;
-
其次,用戶能夠從Web上訪問這個文件,如果文件上傳了,但用戶無法通過Web訪問,或者無法得到Web容器解釋這個腳本,那么也不能稱之為漏洞。
以上條件缺一不可。
一個文件上傳漏洞的列子
一般情況下,我們會通過文件名的后綴來判斷上傳的文件是否符合要求。但是在某些時候,攻擊者可以手動修改了上傳過程中的POST包,在文件名后添加一個%00字節額,則可以截斷某些函數對文件名的判斷。因為在許多語言的函數中,比如在C、PHP等語言的常用字符串處理函數中,0x00被認為是終止符。受此影響的環境有Web應用和一些服務器。比如應用原本只允許上傳JPG圖片,那么可以構造文件名為xxx.php[\0].JPG,其中[\0]為十六進制的0x00字符,.JPG繞過了應用的上傳文件類型判斷;但對於服務器來說,此文件因為0x00字符截斷的關系,最終保存文件時變成了xxx.php。
預防文件上傳漏洞的一些方法
-
客戶端校驗文件名
在客戶端使用JS腳本判斷上傳的文件名是否在白名單之內,如果不符合直接拒絕上傳。但是這種校驗很容易讓攻擊者繞過,比如說攻擊者可以禁用JS,也可以先上傳一個分發的文件名,讓后將請求截住,手動將文件名改成非法的文件名。所以光前端進行校驗是遠遠不夠的,還需要后台一同進行校驗。
-
服務端文件名校驗
上面提到攻擊者可以繞過前端校驗,所以還需要后台一起校驗文件名是否在白名單內。但是光校驗文件名的攻擊者還是能有辦法繞過。比如說0x00截斷(上面提到的,hacker.php%00.jpg),因此還需要其他手段進行進一步校驗。
-
文件頭校驗
查看上傳過來的文件的文件頭是否和擴展名匹配。這種方式一定程度上能降低文件上傳成功的概率。但是個人覺得最穩妥的預防方法還是以下幾種。
-
將上傳上來的文件和Web服務器隔離,專門存放到一台文件服務器上,通過文件ID來訪問。如果非要將文件存放在Web服務器一起,可以將存放文件的文件夾的可執行權限去掉。
-
將上傳的文件進行隨機重新命名。