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