上傳檔案漏洞&解析漏洞
本文致力於探索利用網站漏洞來上傳非法檔案的方法。
基本技術
下面是一些繞過檔案上傳限制的基本技術。其中的漏洞與網站使用的後臺無關,而是由於網頁的編寫者沒有進行完全和有效的限制才產生的漏洞。
型別1:前端驗證
某些網站採用前端驗證的方式限制使用者上傳檔案,這時我們只需去除前端驗證機制即可突破限制,完成上傳。
例如:前端程式碼限制上傳檔案的型別只能為圖片,因此我們上傳php
檔案就會失敗。使用firebug
修改前端程式碼,刪除驗證的程式碼段,再次上傳,即可成功。
型別2:MIME驗證
對於上傳的檔案,上傳時都會指明上傳檔案的型別,即MIME資訊。如果伺服器驗證的是MIME,可以通過修改MIME資訊進行繞過上傳。
例如:後臺要求使用者上傳檔案不能使純文字,驗證MIME資訊,即上傳的MIME資訊不得是plain/text
php
檔案時,將MIME改為圖片的MIME,伺服器就不會阻止檔案的上傳,從而正確生成一個看似不是純文字檔案的php
檔案。
型別3:副檔名漏洞
這類漏洞是由於後臺判斷的副檔名不全才發生的。
例如:伺服器會將以php php2 php3 php4 php5
為字尾名的檔案全部按照php
檔案解析,其中的程式碼會被執行。但是某些後端判定並沒有完全覆蓋這些副檔名,因此上傳這樣副檔名的檔案不會被排斥,這樣我們就能成功上傳一個非法但是有效的檔案。
型別4:檔案內容檢測
簡單來說就是在非法的檔案中加入合法檔案的成分,進而通過檢查。
例如:規定上傳檔案必須是jpg
jpg
檔案的結構。我們知道,jpg
檔案有特定的檔案頭和檔案結尾,在檔案結尾之後的資料不再作為圖片資料進行解析。因此,我們可以在一個正常的jpg
圖片後新增一段php
程式碼,這樣在上傳判定時可以通過內容檢測,在作為程式碼解析時也擁有正確的程式碼段。從而我們上傳了一個非法檔案。
型別5:空位元組截斷目錄路徑檢測繞過
這是一種針對伺服器對上傳檔名解析時,使用空格作為截斷符的機制設計的繞過。
例如:我們上傳的本地檔案的檔名中可能包含空格,如picture.php .jpg
,這時計算機把檔案當成jpg
檔案進行解析。當上傳到伺服器時,我們截獲發出的包,把中間的空格(ASCII 20)改為終止符(ASCII 00),在判定時依然是jpg
picture.php
。
解析導致的上傳漏洞
這一部分利用伺服器系統的一些解析漏洞來進行非法檔案上傳。因此,漏洞的出現和伺服器的型別、版本號都有密切關係。很多漏洞已經在新版本的伺服器中被修正,此處列出僅作為技術交流。
IIS6.0目錄路徑檢測解析繞過
相關漏洞
本例用了IIS6.0目錄路徑檢測解析,檔案的名字為“*.asp/xxx.jpg”,也同樣會被 IIS 當作 ASP檔案來解析並執行
首先我們請求 /aaa.asp/xxxx.jpg
從頭部查詢查詢 "."號,獲得 .asp/xxxx.jpg
查詢"/",如果有則記憶體截斷,所以/aaa.asp/xxxx.jpg會當做/aaa.asp進行解析
根據漏洞描述,不難看出,只需上傳的檔名形如/aaa.asp/xxxx.jpg
,伺服器就會按照asp
的模式進行解析,而上傳的實際檔案字尾名又是jpg
,因此實際上成功突破了上傳限制。在實施時,我們只需通過抓包來修改上傳路徑即可。
IIS6.0解析缺陷繞過
相關漏洞
本例用了IIS6.0目錄路徑檢測解析,檔案的名字為“*.php;xxx.jpg”,也同樣會被 IIS 當作 PHP 檔案來解析並執行
首先我們請求 /aaa.php;xxx.jpg
從頭部查詢查詢 "."號,獲得 .php;xxx.jpg
查詢";",如果有則記憶體截斷,所以/aaa.php;xxx.jpg會當做/aaa.php進行解析
和上面的例子類似,我們只需按照規則上傳一個檔名形如aaa.php;12345.jpg
的檔案,就能突破檔案上傳格式為jpg
的限制,上傳一個可以作為php
解析的檔案。在實施時,我們只需通過抓包來修改上傳檔名即可。
Apache解析缺陷繞過
一般我們認為,檔案的字尾名時檔名最後一個.
之後的字串,但是對於Apache而言,檔案可以存在多個字尾名,即每個.
之後的部分都可以作為字尾名。在解析時,Apache從後向前解析,遇到不合法的則跳過,直到遇上最後一個合法的為止,進行解析。
在我們上傳非法檔案時,我們可以利用這一特性把檔案“改造”成合法檔案。比如我們想要上傳a.php
,但是網站限制不能上傳php
檔案,這時我們可以給檔案新增一個合法的字尾,如a.php.7z
,這樣我們便可以成功上傳。在伺服器解析時,由於7z
是一個不合法(不可解析)的字尾,因此跳過,進而解析成php
檔案。這樣我們就成功上傳了一個非法的檔案。
編輯器引起的上傳漏洞
FCK編輯器漏洞
FCK編輯器作為一種曾經非常流行的編輯器,現在依舊出現在許多網站的後臺。由於FCK編輯器存在檔案上傳功能,因此可以作為一個上傳點進行非法上傳。
利用FCK編輯器進行非法上傳,首先我們需要知道FCK編輯器的版本。進入/_samples/default.html
或/_whatsnew.html
,我們可以檢視到編輯器的版本。
不同版本的編輯器所在的路徑不同。對於FCK2.4.4版本,其上傳地址為editor/filemanager/browser/default/connectors/test.html
,2.6.6版本則在/editor/filemanager/connectors/test.html
。在得到了上傳點地址後,我們就可以利用解析漏洞進行非法上傳。
由於利用的漏洞本質還是解析漏洞,因此方法與上一部分介紹的相同。例如,當伺服器使用的是IIS6.0時,我們可以首先建立一個形如a.asp
的資料夾,並在其中上傳字尾名為jpg
的程式碼,便成功突破了上傳限制,上傳了一個可以解析的檔案。
對非法上傳的防禦機制大致有如下幾種:
客戶端檢測,使用JS對上傳圖片檢測,包括檔案大小、副檔名、檔案型別等
服務端檢測,對檔案大小、檔案路徑、副檔名、檔案型別、檔案內容檢測,對檔案重新命名
其他限制,伺服器端上傳目錄設定不可執行許可權