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