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