【新東網(wǎng)安全大咖帶您走進(jìn)應用安全】中木馬了?別捉急,我來(lái)拯救你!
發(fā)布時(shí)間: 2016-10-31 15:25:51
文/ 邵元明 信息安全部
新東網(wǎng)自2001年成立以來(lái),掌握大數據、云計算、通信、物聯(lián)網(wǎng)及區塊鏈等信息技術(shù),擁有一支逾16年經(jīng)驗的強大IT團隊。為沉淀企業(yè)技術(shù)實(shí)力,繼續發(fā)揮行業(yè)優(yōu)勢,《東網(wǎng)快訊》特邀新東網(wǎng)技術(shù)大咖帶您走進(jìn)這些先進(jìn)信息技術(shù),揭秘新東網(wǎng)16年來(lái)的技術(shù)成果,每周五發(fā)布。
在WEB2.0時(shí)代,隨著(zhù)WEB應用與用戶(hù)的交互逐漸增多,文件上傳功能作為WEB應用的基本功能也在越來(lái)越多的網(wǎng)站中被普遍使用。例如,許多網(wǎng)站都允許用戶(hù)自行上傳頭像、一些社交類(lèi)網(wǎng)站允許用戶(hù)上傳照片、一些服務(wù)類(lèi)網(wǎng)站需要用戶(hù)上傳證明材料的電子檔、電商類(lèi)網(wǎng)站允許用戶(hù)上傳圖片展示商品情況等。然而,看似不起眼的文件上傳功能如果沒(méi)有做好安全防護措施,就存在巨大的安全風(fēng)險,黑客可以通過(guò)上傳WEBSHELL文件來(lái)對服務(wù)器進(jìn)行控制。
WEBSHELL又稱(chēng)網(wǎng)頁(yè)木馬文件,根據開(kāi)發(fā)語(yǔ)言的不同又分為ASP木馬、PHP木馬、JSP木馬等。如果該類(lèi)木馬利用腳本語(yǔ)言中的系統命令執行、文件讀寫(xiě)等函數功能,一旦上傳到服務(wù)器被腳本引擎解析,攻擊者就可以實(shí)現對服務(wù)器的控制。
稍有經(jīng)驗的開(kāi)發(fā)者都知道對文件上傳功能進(jìn)行一些限制,防止用戶(hù)上傳網(wǎng)頁(yè)木馬文件。但是如果開(kāi)發(fā)者沒(méi)有使用有效的限制手段,就往往不能很好地阻止攻擊者上傳木馬文件。下面,我們對一些常見(jiàn)的限制手段進(jìn)行分析:
一、JavaScript檢測
JavaScript檢測是在客戶(hù)端瀏覽器上使用JavaScript腳本對上傳的文件進(jìn)行檢測。由于JavaScript是在客戶(hù)端運行的,攻擊者可以通過(guò)禁用JavaScript腳本、修改JavaScript腳本、在上傳過(guò)程中攔截修改數據包等方式輕易地繞過(guò)JavaScript檢測。
二、MIME類(lèi)型和文件內容檢測
一些開(kāi)發(fā)者會(huì )在服務(wù)端通過(guò)上傳文件的MIME類(lèi)型和文件內容對文件進(jìn)行檢查,如只允許MIME類(lèi)型為圖片或文件內容中包含圖片類(lèi)型文件頭的文件上傳,以此阻止用戶(hù)上傳網(wǎng)頁(yè)木馬文件。這種方式也存在缺陷。因為MIME類(lèi)型是由客戶(hù)端提交的可以被篡改,而在網(wǎng)頁(yè)木馬文件中添加圖片類(lèi)型的文件頭并不會(huì )影響網(wǎng)頁(yè)木馬文件正常執行,因此攻擊者可以通過(guò)篡改或偽造請求包,發(fā)送MIME類(lèi)型和文件頭符合要求的木馬文件。
三、文件擴展名檢測
相比較前面兩種檢測模式,在服務(wù)端針對文件擴展名的檢測會(huì )更加有效。因為正常情況下,如果用戶(hù)上傳的網(wǎng)頁(yè)木馬文件不是以響應的腳本文件擴展名上傳的,則無(wú)法正常運行,達不到控制網(wǎng)站服務(wù)器的目的。然而,如果對文件擴展名檢測的實(shí)現方式不當的話(huà)仍然存在風(fēng)險。文件擴展名檢測通常分為黑名單檢測和白名單檢測兩種:
黑名單檢測:黑名單定義了一系列不安全的擴展名。服務(wù)器端在接受文件后,與黑名單擴展名對比,如果文件擴展名與黑名單里的擴展名匹配,則認為文件不合法。例如,可以將ASP、PHP、JSP等常見(jiàn)的腳本文件擴展名列入黑名單禁止上傳。黑名單主要存在的問(wèn)題是黑名單的完整性問(wèn)題,如asa、cer、cdx、php3等一些不常用的擴展名可能沒(méi)有加入黑名單;在進(jìn)行黑名單匹配前沒(méi)有文件擴展名進(jìn)行大小寫(xiě)轉換操作,且黑名單擴展名全部為小寫(xiě),那就意味著(zhù)php、asp這樣的擴展名,只要換成PHP、ASP就能正常上傳;在Windows系統下,如果文件名以小數點(diǎn)、下劃線(xiàn)或空格作為結尾,系統保存文件時(shí)會(huì )自動(dòng)去除將這些字符,因此如果黑名單中沒(méi)有包括類(lèi)似“asp.”或者“asp_”這樣的擴展名,攻擊者可以通過(guò)上傳這些擴展名的網(wǎng)頁(yè)木馬文件繞過(guò)黑名單檢測實(shí)現上傳木馬。
白名單檢測的機制恰恰相反,通常是根據業(yè)務(wù)實(shí)際需要事先定義好上傳的文件擴展名只能為JPG、PNG、GIF、7Z等無(wú)安全風(fēng)險的擴展名,當攻擊者上傳其他擴展名的文件就會(huì )被拒絕。相比之下,白名單檢測機制的可靠性會(huì )更強一些,不像黑名單檢測機制一樣容易被繞過(guò),但在一些特殊情況下攻擊者仍有一些方法可以繞過(guò)檢測機制進(jìn)行攻擊:
1、對于IIS6.0而言,若文件目錄名以.ASP或.ASA等腳本文件擴展名形式結尾,則該文件目錄下的所有文件都會(huì )被當做ASP文件解析。因此,如果上傳功能允許用戶(hù)自定義上傳的文件路徑,則可以通過(guò)將文件路徑設置為以.ASP結尾的形式進(jìn)行攻擊,此時(shí)即使上傳的網(wǎng)頁(yè)木馬文件符合擴展名白名單仍會(huì )被作為腳本解析。此外,在IIS6.0的環(huán)境下如果上傳類(lèi)似于1.php;1.jpg形式的網(wǎng)頁(yè)木馬文件,也會(huì )被當做腳本解析。
2、在windows環(huán)境下,/x00是終止符,如果文件路徑或文件名包含/x00則在保存文件的時(shí)候系統會(huì )自動(dòng)將/x00后的內容略去,因此可以上傳類(lèi)似于1.php/x001.jpg這樣的文件或將文件上傳目錄設置為1.php/x00。系統在保存文件時(shí)都會(huì )將文件保存為1.php這樣的腳本文件,從而達到攻擊目的。
3、Apache在解析文件時(shí)如果遇到無(wú)法識別的擴展名,將會(huì )從后向前解析,直到碰到認識的擴展名為止。如果擴展名白名單中包含Apache無(wú)法解析的擴展名(以.7z為例),則可以構造類(lèi)似于:1.php.7z這樣的文件名進(jìn)行上傳。由于7z文件Apache無(wú)法解析,Apache最終會(huì )將該文件作為PHP腳本解析。
4、Nginx在早期的版本中,如果用戶(hù)在URL后加上類(lèi)似于/1.php這樣的字符串進(jìn)行訪(fǎng)問(wèn),URL中的文件就會(huì )被按照字符串中的腳本類(lèi)型進(jìn)行解析。因此可以通過(guò)上傳一個(gè)擴展名符合白名單要求的網(wǎng)頁(yè)木馬文件,訪(fǎng)問(wèn)時(shí)在URL后加上上述字符串將該文件解析為網(wǎng)頁(yè)木馬。
綜上所述,要保障文件上傳功能的安全性就需要限制用戶(hù)上傳的文件類(lèi)型,防止用戶(hù)上傳網(wǎng)頁(yè)木馬文件。在服務(wù)端對擴展名進(jìn)行白名單檢測是相對安全的做法,但如果處理不當仍然存在風(fēng)險。建議對文件上傳功能進(jìn)行如下處置,可以避免本文中各種文件上傳漏洞:
1、在服務(wù)端對擴展名進(jìn)行白名單校驗,擴展名不符合白名單的不允許上傳;
2、上傳過(guò)程不允許用戶(hù)直接設置文件路徑,必要時(shí)可以使用預先設置路徑列表中的匹配索引值,嚴禁泄露文件絕對路徑;
3、對文件進(jìn)行重命名,使用隨機性好的文件目錄和文件名進(jìn)行保存;
4、對文件的上傳目錄和臨時(shí)文件目錄設置不解析和執行;
5、有條件時(shí)可以將文件以數據的形式保存和讀取。