文件上傳漏洞是指用戶上傳了一個(gè)可執(zhí)行的腳本文件惠毁,并通過此腳本文件獲得了執(zhí)行服務(wù)器端命令的能力灯蝴。文件上傳功能本身是一個(gè)正常的業(yè)務(wù)需求颜骤,對(duì)于網(wǎng)站來說柔袁,很多時(shí)候也確實(shí)需要用戶將文件上傳到服務(wù)器呆躲。所以文件上傳本身沒有問題,但又問題的是文件上傳后捶索,服務(wù)器怎么處理插掂、解釋文件。如果服務(wù)器的處理邏輯做得不夠安全腥例,則會(huì)導(dǎo)致嚴(yán)重的后果辅甥。----摘自《白帽子講WEB安全》
一、漏洞成立的條件
1院崇、上傳的文件能夠被WEB容器解釋執(zhí)行肆氓。
2、用戶能夠從web上訪問這個(gè)文件底瓣。如果文件上傳了延塑,但用戶無法通過web訪問丙笋,或者無法使得web容器解釋這個(gè)腳本,那么也不能稱之為漏洞鸽捻。
二凳鬓、常見防御措施及軟肋
1茁肠、在前端驗(yàn)證文件擴(kuò)展名
? 通過這種方式的驗(yàn)證,繞過方式有二:
(1)客戶端禁用JS腳本
? 禁用JS腳本缩举,這就使得驗(yàn)證文件的功能失效垦梆,用戶可上傳任意的文件。
(2)通過抓包改包方式
? 假如前端限制了只允許上傳png格式的文件仅孩。我們首先將一句話木馬文件后綴名更改為png后上傳托猩。此時(shí)會(huì)繞過前端js的驗(yàn)證,繞過驗(yàn)證后辽慕,通過抓包京腥,修改報(bào)文中文件名的后綴,使其還原溅蛉。顯然公浪,一句話木馬上傳成功他宛。
2、在服務(wù)端驗(yàn)證文件類型
? 在服務(wù)端驗(yàn)證文件類型欠气,一般是校驗(yàn)Content-type字段的值厅各。同樣,通過抓包改包可成功繞過其驗(yàn)證预柒。
3讯检、在服務(wù)端驗(yàn)證文件后綴名
(1)黑名單校驗(yàn)
? 黑名單校驗(yàn)方式極不靠譜,我們總會(huì)找到一些漏網(wǎng)之魚卫旱,也有可能存在一些大小寫繞過的方式人灼。比如 aSp 和 pHp 之類的。
(2)白名單校驗(yàn)
? 白名單校驗(yàn)顾翼,其防御能力相對(duì)于黑名單校驗(yàn)投放,要更安全,增加了攻擊者的攻擊難度适贸。但是白名單也有其軟肋之處:如果服務(wù)器存在解析漏洞或截?cái)嗑姆迹瑒t會(huì)成功觸發(fā)漏洞。如:
A:0x00 截?cái)嗬@過
? 用像test.asp%00.jpg的方式進(jìn)行截?cái)喟葑耍瑢儆诎酌麊挝募友S捎诖嬖?x00,服務(wù)器會(huì)認(rèn)為是asp文件蕊肥。
B:解析/包含漏洞繞過
? 這類漏洞直接配合上傳一個(gè)代碼注入過的白名單文件即可谒获,再利用解析,包含漏洞壁却。
4批狱、在服務(wù)端驗(yàn)證文件內(nèi)容
? 驗(yàn)證文件內(nèi)容,加大了攻擊者的攻擊難度展东。但在一定條件下赔硫,也有繞過的可能。其繞過方式有二:
(1)制作圖片馬
(2)文件幻術(shù)頭繞過
三盐肃、總結(jié)
? 以上這些防御措施爪膊,如果在一定的限制條件下,是“安全的”砸王。如果超過了安全邊界推盛,則會(huì)變得那么不安全。對(duì)于文件上傳漏洞处硬,我們只要知道它成立的條件小槐,則可在一定程度上進(jìn)行防御。其總結(jié)如下:
1、上傳后的文件最好不可執(zhí)行凿跳。
2件豌、更改上傳后的文件名,不與上傳之前的文件名相同控嗜。
3茧彤、如非必要,不要暴漏文件的訪問路徑疆栏。