孫志成
(河北工業(yè)職業(yè)技術(shù)學(xué)院 河北 石家莊 050091)
在日常可訪問的Web網(wǎng)頁中,文件上傳是一個(gè)很常見的功能:例如發(fā)布照片、提交報(bào)告、上傳文檔等情況時(shí),都會(huì)涉及到文件上傳功能。而如果Web服務(wù)端并沒有對(duì)用戶提交的數(shù)據(jù)進(jìn)行嚴(yán)格過濾,導(dǎo)致包含有惡意代碼的文件被上傳并執(zhí)行,即說明此處功能含有文件上傳漏洞。文件上傳漏洞是Web系統(tǒng)上的一個(gè)比較經(jīng)典的漏洞。進(jìn)行攻擊的技術(shù)要求不高,產(chǎn)生的后果卻可能會(huì)很大,比如通過上傳一個(gè)WebSHELL類型的文件并成功觸發(fā)后,有可能會(huì)直接得到類似shell的命令執(zhí)行方法甚至獲取系統(tǒng)的操作權(quán)限;如果Web程序是通過root用戶啟動(dòng)的,也許一次攻擊即可獲得系統(tǒng)的最高權(quán)限。因此對(duì)于文件上傳漏洞的防御,值得我們進(jìn)行深入的研究。
對(duì)于不同的操作系統(tǒng)或不同的Web容器來說,操作命令、文件系統(tǒng)、文件類型都有所區(qū)別,所以攻擊的細(xì)節(jié)也有所不同。但通常來說,針對(duì)此類型漏洞,攻擊者的攻擊過程是類似的,一般分為三個(gè)步驟。
(1)通過文件上傳功能,上傳包含有惡意代碼的文件。此處的文件通常為木馬文件,這一步驟主要是通過大量的異常文件上傳,判斷出Web端對(duì)于文件所做的過濾,然后繞過這些防御措施,將木馬文件成功上傳至目標(biāo)服務(wù)器。
(2)通過瀏覽器的元素探測功能,或通過網(wǎng)絡(luò)抓包,探知上傳的文件保存在Web服務(wù)器的具體位置,此處并不需要精確的絕對(duì)路徑,只需要獲得能直接訪問到木馬文件的URL地址即可進(jìn)行下一步攻擊。常見的獲取路徑的方法也有下載已正常上傳的文件,通過抓取數(shù)據(jù)包來確定服務(wù)器上存放上傳文件的目錄路徑,再和木馬文件的文件名組合出URL,即可進(jìn)行下一步操作[1]。
(3)通過URL向已確定具體位置的木馬文件傳遞參數(shù),觸發(fā)木馬文件執(zhí)行,進(jìn)行攻擊。此步驟對(duì)于參數(shù)的傳遞,視不同的木馬文件而有所區(qū)別。此外,不同類型的Web容器,可解析的文件類型也是不相同的。
對(duì)于此漏洞的防御措施,可以有針對(duì)性地通過上述三個(gè)攻擊步驟展開。
Web服務(wù)器收到客戶端發(fā)出的上傳文件請(qǐng)求時(shí)需要判斷文件是否符合檢測要求需要限制上傳文件的大小,以保護(hù)Web服務(wù)器的磁盤可用空間。需要檢測檢測上傳文件名是否包含非法字符;特別是“../”一類的字符,防止文件被傳至目標(biāo)服務(wù)器保存文件的上一層路徑,甚至替換掉系統(tǒng)文件。需要檢測文件的后綴名,以防止將“.exe”“.asp”“.php”等類型的文件上傳至服務(wù)器。需要檢測文件類型,主要是檢測客戶端請(qǐng)求頭中的content-type字段,可以過濾掉如“application/x-msdownload”“text/asp”等類型的文件。需要檢測文件頭的內(nèi)容,根據(jù)文件特征碼再次判斷文件類型。
需要注意的是,對(duì)于上傳文件的校驗(yàn)檢測,在Web客戶端和Web服務(wù)端均可以實(shí)施。理想的方式是前端和后端都進(jìn)行所有的檢測。若校驗(yàn)項(xiàng)過多,可能導(dǎo)致前端性能方面壓力較大,可以只在前端進(jìn)行相對(duì)簡單的校驗(yàn),例如文件大小和文件名的檢測。而客戶端校驗(yàn)通過后,服務(wù)端依然要進(jìn)行該項(xiàng)校驗(yàn),目的是防止客戶端向服務(wù)端進(jìn)行網(wǎng)絡(luò)傳輸?shù)倪^程中有數(shù)據(jù)包被攔截并修改,導(dǎo)致客戶端發(fā)出的數(shù)據(jù)包和服務(wù)端收到的數(shù)據(jù)包并不一致[2-3]。
在這些檢測中,黑名單的檢驗(yàn)可靠性并不高。例如對(duì)文件名后綴的校驗(yàn),比較容易通過字母大小寫的組合通過Web系統(tǒng)的黑名單檢查。而對(duì)于文件類型的校驗(yàn),也可以通過類似的手段規(guī)避掉黑名單檢查。所以在需要有校驗(yàn)的地方,盡量使用白名單,這樣可以盡量規(guī)避由使用黑名單帶來的風(fēng)險(xiǎn)。
攻擊者上傳木馬文件后,若要通過此木馬進(jìn)行攻擊,需要先確定文件在Web服務(wù)器上的路徑。因此在文件成功上傳后,服務(wù)端不應(yīng)該暴露出該文件所在的路徑,即URL地址。例如上傳文件完成后,Web界面上不應(yīng)該顯示出此文件上傳到了哪個(gè)路徑;若上傳后的文件可以被下載,應(yīng)該注意下載的請(qǐng)求或響應(yīng)數(shù)據(jù)包不能帶有文件的真實(shí)路徑;若文件可以在Web界面上展示,應(yīng)該注意網(wǎng)頁的源代碼不能暴露文件的相對(duì)或絕對(duì)路徑,以防止攻擊者通過瀏覽器的開發(fā)者選項(xiàng)或網(wǎng)絡(luò)抓包探測到文件的地址信息。此外,文件上傳后最好可以通過服務(wù)器將其隨機(jī)改名;即使攻擊者探測到了文件的路徑信息,依然難以確定其精確的訪問地址[4]。
以Linux服務(wù)器為例,修改文件上傳目錄的權(quán)限,將其設(shè)置為不可執(zhí)行,這樣可以防止攻擊者訪問該目錄下的文件。既然不可訪問,自然也就無法觸發(fā)木馬文件。也可以通過上傳時(shí)渲染文件的方式,例如文件壓縮、加密等方法修改文件的內(nèi)容,使文件中的代碼不可以被執(zhí)行,也可以達(dá)到相同的效果。
本文主要介紹了文件上傳漏洞的產(chǎn)生原因、一般的攻擊手段,也提出了比較有效的防御方法,以幫助網(wǎng)站開發(fā)者可以很大程度降低此漏洞的安全風(fēng)險(xiǎn)。然而世界上并沒有絕對(duì)安全的系統(tǒng),開發(fā)者和用戶都需要在平時(shí)注意使用規(guī)范,將安全風(fēng)險(xiǎn)降到最低。