文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,并通過此腳本文件獲得了執行服務器端命令的能力。文件上傳功能本身是一個正常的業務需求,對于網站來說,很多時候也確實需要用戶將文件上傳到服務器。所以文件上傳本身沒有問題,但又問題的是文件上傳后,服務器怎么處理、解釋文件。如果服務器的處理邏輯做得不夠安全,則會導致嚴重的后果。----摘自《白帽子講WEB安全》
一、漏洞成立的條件
1、上傳的文件能夠被WEB容器解釋執行。
2、用戶能夠從web上訪問這個文件。如果文件上傳了,但用戶無法通過web訪問,或者無法使得web容器解釋這個腳本,那么也不能稱之為漏洞。
二、常見防御措施及軟肋
1、在前端驗證文件擴展名
? 通過這種方式的驗證,繞過方式有二:
(1)客戶端禁用JS腳本
? 禁用JS腳本,這就使得驗證文件的功能失效,用戶可上傳任意的文件。
(2)通過抓包改包方式
? 假如前端限制了只允許上傳png格式的文件。我們首先將一句話木馬文件后綴名更改為png后上傳。此時會繞過前端js的驗證,繞過驗證后,通過抓包,修改報文中文件名的后綴,使其還原。顯然,一句話木馬上傳成功。
2、在服務端驗證文件類型
? 在服務端驗證文件類型,一般是校驗Content-type字段的值。同樣,通過抓包改包可成功繞過其驗證。
3、在服務端驗證文件后綴名
(1)黑名單校驗
? 黑名單校驗方式極不靠譜,我們總會找到一些漏網之魚,也有可能存在一些大小寫繞過的方式。比如 aSp 和 pHp 之類的。
(2)白名單校驗
? 白名單校驗,其防御能力相對于黑名單校驗,要更安全,增加了攻擊者的攻擊難度。但是白名單也有其軟肋之處:如果服務器存在解析漏洞或截斷,則會成功觸發漏洞。如:
A:0x00 截斷繞過
? 用像test.asp%00.jpg的方式進行截斷,屬于白名單文件。由于存在0x00,服務器會認為是asp文件。
B:解析/包含漏洞繞過
? 這類漏洞直接配合上傳一個代碼注入過的白名單文件即可,再利用解析,包含漏洞。
4、在服務端驗證文件內容
? 驗證文件內容,加大了攻擊者的攻擊難度。但在一定條件下,也有繞過的可能。其繞過方式有二:
(1)制作圖片馬
(2)文件幻術頭繞過
三、總結
? 以上這些防御措施,如果在一定的限制條件下,是“安全的”。如果超過了安全邊界,則會變得那么不安全。對于文件上傳漏洞,我們只要知道它成立的條件,則可在一定程度上進行防御。其總結如下:
1、上傳后的文件最好不可執行。
2、更改上傳后的文件名,不與上傳之前的文件名相同。
3、如非必要,不要暴漏文件的訪問路徑。