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