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