劉仁珩 甘肅聯(lián)通蘭州分公司 甘肅蘭州 730030
上傳漏洞原理及防范
劉仁珩 甘肅聯(lián)通蘭州分公司 甘肅蘭州 730030
件名稱,因?yàn)樵S多Web應(yīng)用都會(huì)修改上傳文件的文件名稱,那么這時(shí)就需要結(jié)合其他漏洞去獲取到這些信息。如果不知道上傳文件的存放路徑和文件名稱,即使你上傳了也無(wú)法訪問(wèn)。
通常web 站點(diǎn)會(huì)有用戶注冊(cè)功能,而當(dāng)用戶登錄之后大多數(shù)情況下都會(huì)存在類似頭像上傳、附件上傳一類的功能,這些功能點(diǎn)往往存在上傳驗(yàn)證方式不嚴(yán)格的安全缺陷,是在web 滲透中非常關(guān)鍵的突破口,只要經(jīng)過(guò)仔細(xì)測(cè)試分析來(lái)繞過(guò)上傳驗(yàn)證機(jī)制,往往會(huì)造成被攻擊者直接上傳web 后門,進(jìn)而獲取整個(gè)web業(yè)務(wù)的控制權(quán),復(fù)雜一點(diǎn)的情況是結(jié)合web server 的解析漏洞來(lái)上傳后門獲取權(quán)限的。
通常一個(gè)文件以HTTP協(xié)議進(jìn)行上傳時(shí),將以POST請(qǐng)求發(fā)送至web 服務(wù)器,web 服務(wù)器接收到請(qǐng)求并同意后,用戶與web 服務(wù)器將建立連接,并傳輸data。
主流的文件上傳檢測(cè)方式有以下五種:
◎A 客戶端 javascript 檢測(cè)(通常為檢測(cè)文件擴(kuò)展名)
◎B 服務(wù)端 MIME 類型檢測(cè)(檢測(cè)Content-Type內(nèi)容)
◎C 服務(wù)端目錄路徑檢測(cè)(檢測(cè)跟path 參數(shù)相關(guān)的內(nèi)容)
◎D 服務(wù)端文件擴(kuò)展名檢測(cè)(檢測(cè)跟文件extension 相關(guān)的內(nèi)容)
◎E 服務(wù)端文件內(nèi)容檢測(cè)(檢測(cè)內(nèi)容是否合法或含有惡意代碼)
1)客戶端 javascript 檢測(cè)
客戶端檢測(cè)通常在上傳頁(yè)面里含有專門檢測(cè)文件上傳的javascript代碼,在文件被上傳之前進(jìn)行檢測(cè),最常見(jiàn)的就是檢測(cè)上傳文件的文件類型和大小是否合法。
2)服務(wù)端MIME類型檢測(cè)
這類檢測(cè)方法通過(guò)檢查http包的Content-Type字段中的值來(lái)判斷上傳文件是否合法。
3)服務(wù)端文件擴(kuò)展名檢測(cè)
這類檢測(cè)方法通過(guò)在服務(wù)端檢測(cè)上傳文件的擴(kuò)展名來(lái)判斷文件是否合法。
4)服務(wù)端目錄路徑檢測(cè)
這類檢測(cè)一般通過(guò)檢測(cè)路徑是否合法來(lái)判斷。
5)服務(wù)端文件內(nèi)容檢測(cè)
這類檢測(cè)方法相當(dāng)對(duì)上面四種檢測(cè)方法來(lái)說(shuō)是最為嚴(yán)格的一種。它通過(guò)檢測(cè)文件內(nèi)容來(lái)判斷上傳文件是否合法。這里,對(duì)文件內(nèi)容的檢測(cè)主要有兩種方法。A、通過(guò)檢測(cè)上傳文件的文件頭來(lái)判斷。通常情況下,通過(guò)判斷前10個(gè)字節(jié),基本就能判斷出一個(gè)文件的真實(shí)類型。B、文件加載檢測(cè),一般是調(diào)用API或函數(shù)對(duì)文件進(jìn)行加載測(cè)試。常見(jiàn)的是圖像渲染測(cè)試,再嚴(yán)格點(diǎn)的甚至是進(jìn)行二次渲染。
上面我們分析了主流的文件上傳檢測(cè)方式,下面我們就來(lái)看下如何繞過(guò)上面提到的文件上傳檢測(cè)方式。
3.1 客戶端繞過(guò)
在對(duì)上傳文件進(jìn)行文件類型判斷時(shí),如果使用客戶端腳本(javascript)來(lái)檢測(cè)文件合法性,則程序必定會(huì)存在上傳漏洞,由于客戶端腳本僅作用于客戶端環(huán)境,無(wú)法校驗(yàn)最終需要發(fā)送的數(shù)據(jù),導(dǎo)致該種檢測(cè)方法失效。
實(shí)例代碼:
3.2 服務(wù)端繞過(guò)
在對(duì)上傳文件類型使用服務(wù)端驗(yàn)證時(shí),由于驗(yàn)證方式及代碼邏輯存在漏洞,也會(huì)導(dǎo)致上傳繞過(guò)。例如,在如下php文件類型檢測(cè)腳本中,服務(wù)端通過(guò)MIME類型來(lái)檢測(cè)文件合法性,則攻擊者可以通過(guò)偽造MIME類型來(lái)達(dá)到欺騙應(yīng)用程序上傳非法文件的目的。
實(shí)例代碼:
得到服務(wù)端的應(yīng)答,服務(wù)端MIME檢測(cè)方式被成功繞過(guò)。
在實(shí)際編碼過(guò)程中,服務(wù)端繞過(guò)的例子不僅僅局限于MIME繞過(guò),此處不做一一例舉。
文件解析漏洞是指,由于文件自身在文件名解析方面存在的bug,導(dǎo)致正常合法文件被當(dāng)作腳本文件來(lái)解析。如IIS解析漏洞、NGINX解析漏洞等。攻擊者通常會(huì)利用上傳模塊上傳一個(gè)文件名合法的webshell腳本,然后利用解析漏洞去執(zhí)行。
4.1 1IIS 解析漏洞
IIS6.0 在解析asp 格式的時(shí)候有兩個(gè)解析漏洞,一個(gè)是如果目錄名包含".asp"字符串,那么這個(gè)目錄下所有的文件都會(huì)按照asp 去解析,另一個(gè)是只要文件名中含有".asp;"會(huì)優(yōu)先按asp 來(lái)解析。
IIS7.0/7.5 是對(duì)php 解析時(shí)有一個(gè)類似于Nginx 的解析漏洞,對(duì)任意文件名只要在URL后面追加上字符串"/任意文件名.php"就會(huì)按照php 的方式去解析。
4.2 Nginx 解析漏洞
nginx是一款高性能的web服務(wù)器,使用非常廣泛,其不僅經(jīng)常被用做反向代理,也可以非常好的支持PHP的運(yùn)行。80sec發(fā)現(xiàn)其中存在一個(gè)較為嚴(yán)重的安全問(wèn)題,默認(rèn)情況下可能導(dǎo)致服務(wù)器錯(cuò)誤的將任何類型的文件以PHP的方式進(jìn)行解析,這將導(dǎo)致嚴(yán)重的安全問(wèn)題,使得惡意的攻擊者可能攻陷支持php的Nginx服務(wù)器。
目前Nginx 主要有這兩種漏洞,一個(gè)是對(duì)任意文件名在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加為test.jpg/x.php 進(jìn)行解析攻擊。還有一種是對(duì)低版本的Nginx 可以在任意文件名后面添加%00.php 進(jìn)行解析攻擊。
通過(guò)對(duì)上傳漏洞原理的了解,我們將從以下幾個(gè)層面著手對(duì)其進(jìn)行防護(hù):
5.1 棄用客戶端檢測(cè)
由于客戶端檢測(cè)方式自身缺陷導(dǎo)致該檢測(cè)方式容易被繞過(guò),因此,在對(duì)上傳文件類型進(jìn)行驗(yàn)證時(shí)應(yīng)避免使用客戶端檢測(cè)方式。
5.2 棄用MIME檢測(cè)
由于MIME檢測(cè)中MIME數(shù)據(jù)容易被偽造,因此,在對(duì)上傳文件類型進(jìn)行檢測(cè)時(shí)應(yīng)該棄用MIME檢測(cè)。
5.3 文件名檢測(cè)
使用白名單規(guī)定上傳文件類型檢測(cè)時(shí)應(yīng)注意區(qū)分大小寫(xiě)。
5.4 文件內(nèi)容檢測(cè)
對(duì)所要上傳的文件內(nèi)容進(jìn)行檢測(cè),判斷其內(nèi)容是否合法,是否符合上傳文件類型要求。
[1] 王江為.基于ASP上傳源碼的漏洞分析及解決策略研究[M].安徽:電腦知識(shí)與技術(shù),2012
[2] 張新杰.網(wǎng)絡(luò)編程文件的上傳漏洞以及解決方法[M].河北:價(jià)值工程,2012
[3] 白興瑞.高校WEB站點(diǎn)的上傳漏洞分析及防范[M].河北:衡水學(xué)院學(xué)報(bào),2011