文件上傳漏洞及解析漏洞總結

文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,並通過此腳本文件獲得了執行服務器端命令的能力。這種***方式是最爲直接和有效的,“文件上傳”本身沒有問題,有問題的是文件上傳後,服務器怎麼處理、解釋文件。如果服務器的處理邏輯做的不夠安全,則會導致嚴重的後果。

文件上傳後導致的常見安全問題一般有:

1)上傳文件是Web腳本語言,服務器的Web容器解釋並執行了用戶上傳的腳本,導致代碼執行。

2)上傳文件是Flash的策略文件crossdomain.xml,***用以控制Flash在該域下的行爲(其他通過類似方式控制策略文件的情況類似);

3)上傳文件是病毒、***文件,***用以誘騙用戶或者管理員下載執行。

4)上傳文件是釣魚圖片或爲包含了腳本的圖片,在某些版本的瀏覽器中會被作爲腳本執行,被用於釣魚和欺詐。

 

除此之外,還有一些不常見的利用方法,比如將上傳文件作爲一個入口,溢出服務器的後臺處理程序,如圖片解析模塊;或者上傳一個合法的文本文件,其內容包含了PHP腳本,再通過"本地文件包含漏洞(Local File Include)"執行此腳本;等等。

要完成這個***,要滿足以下幾個條件:

首先,上傳的文件能夠被Web容器解釋執行。所以文件上傳後所在的目錄要是Web容器所覆蓋到的路徑。

其次,用戶能夠從Web上訪問這個文件。如果文件上傳了,但用戶無法通過Web訪問,或者無法得到Web容器解釋這個腳本,那麼也不能稱之爲漏洞。

最後,用戶上傳的文件若被安全檢查、格式化、圖片壓縮等功能改變了內容,則也可能導致***不成功。


一、從FCKEditor文件上傳漏洞談起

FCKEditor是一款非常流行的富文本編輯器,爲了方便用戶,它帶有一個文件上傳功能,但是這個功能卻出過多次漏洞。

FCKEditor針對ASP/PHP/JSP等環境都有對應的版本,以PHP爲例,其文件上傳功能在:

http://www.xxx.com/path/FCKEditor/editor/filemanager/browser/default/browser.html?,配合解析漏洞。

(一)IIS5.x-6.x解析漏洞

 

使用iis5.x-6.x版本的服務器,大多爲windows server 2003,網站比較古老,開發語句一般爲asp;該解析漏洞也只能解析asp文件,而不能解析aspx文件。

 

目錄解析(6.0)

 

形式:www.xxx.com/xx.asp/xx.jpg

原理服務器默認會把.asp.asp目錄下的文件都解析成asp文件。

 

文件解析

 

形式:www.xxx.com/xx.asp;.jpg

原理:服務器默認不解析;號後面的內容,因此xx.asp;.jpg便被解析成asp文件了。

解析文件類型

 

IIS6.0 默認的可執行文件除了asp還包含這三種 :

/test.asa

/test.cer

/test.cdx

 

(二)apache解析漏洞

 

漏洞原理

 

Apache 解析文件的規則是從右到左開始判斷解析,如果後綴名爲不可識別文件解析,就再往左判斷。比如test.php.qwe.asd .qwe”和”.asd” 這兩種後綴是apache不可識別解析,apache就會把wooyun.php.qwe.asd解析成php

 

漏洞形式

 

www.xxxx.xxx.com/test.php.php123

 

其餘配置問題導致漏洞

 

1)如果在 Apache 的 conf 裏有這樣一行配置 AddHandler php5-script .php 這時只要文件名裏包含.php 即使文件名是 test2.php.jpg 也會以 php 來執行。

2)如果在 Apache 的 conf 裏有這樣一行配置 AddType application/x-httpd-php .jpg 即使擴展名是 jpg,一樣能以php 方式執行。

 

修復方案

 

1.apache配置文件,禁止.php.這樣的文件執行,配置文件裏面加入

2.用僞靜態能解決這個問題,重寫類似.php.*這類文件,打開apachehttpd.conf找到LoadModule rewrite_module modules/mod_rewrite.so

#號去掉,重啓apache,在網站根目錄下建立.htaccess文件



(三)nginx解析漏洞

 

漏洞原理

 

Nginx默認是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通過正則匹配設置SCRIPT_FILENAME。當訪問www.xx.com/phpinfo.jpg/1.php這個URL時,$fastcgi_script_name會被設置爲“phpinfo.jpg/1.php”,然後構造成SCRIPT_FILENAME傳遞給PHP CGI,但是PHP爲什麼會接受這樣的參數,並將phpinfo.jpg作爲PHP文件解析呢?這就要說到fix_pathinfo這個選項了。 如果開啓了這個選項,那麼就會觸發在PHP中的如下邏輯:

 

PHP會認爲SCRIPT_FILENAMEphpinfo.jpg,而1.phpPATH_INFO,所以就會將phpinfo.jpg作爲PHP文件來解析了

 

漏洞形式

 

www.xxxx.com/UploadFiles/p_w_picpath/1.jpg/1.php

www.xxxx.com/UploadFiles/p_w_picpath/1.jpg%00.php

www.xxxx.com/UploadFiles/p_w_picpath/1.jpg/%20\0.php

 

另外一種手法:上傳一個名字爲test.jpg,然後訪問test.jpg/.php,在這個目錄下就會生成一句話***shell.php



(四)IIS7.5解析漏洞

 

IIS7.5的漏洞與nginx的類似,都是由於php配置文件中,開啓了cgi.fix_pathinfo,而這並不是nginx或者iis7.5本身的漏洞。

5.配合操作系統文件命令規則

1)上傳不符合windows文件命名規則的文件名

test.asp.

test.asp(空格)

test.php:1.jpg

test.php:: $DATA

會被windows系統自動去掉不符合規則符號後面的內容。

 

如圖訪問ip/Netsys/HtmlEdit/fckeditor/editor/filemanager/connectors/test.html

wKiom1gPRHviHFZEAAF8il_CHak871.png


點擊Create Folder新建文件夾

wKioL1gPRLKhrsxJAAEs7-iaawU576.png



brup suite進行改包,將%2F改爲a.asp

wKioL1gPRNKh4kGwAACUjUtp1yU968.png

點擊Get Folders獲得文件夾。


wKioL1gPRSrhI-p9AACHReJicYA006.png

上傳文件,我這裏上傳了一句話圖片***,然後能看到上傳的路徑,訪問的是1.asp/FI201610191827336199.jpg,會被當作asp執行,用菜刀連接getshell。

wKioL1gPRUXiaZybAACPcJnRUEY833.png


二、繞過文件上傳檢查功能

一般都是通過文件名後綴檢查。但是在某些時候,***者手動修改了上傳過程中的POST包,在文件名後添加一個%00字節額,則可以截斷某些函數對文件名的判斷。因爲在許多語言的函數中,比如在C、PHP等語言的常用字符串處理函數中,0x00被認爲是終止符。受此影響的環境有Web應用和一些服務器。比如應用原本只允許上傳JPG圖片,那麼可以構造文件名爲xxx.php[\0].JPG,其中[\0]爲十六進制的0x00字符,.JPG繞過了應用的上傳文件類型判斷;但對於服務器來說,此文件因爲0x00字符截斷的關係,最終卻變成了xxx.php。

 

1.客戶端校驗  

一般都是在網頁上寫一段javascript腳本,校驗上傳文件的後綴名,有白名單形式也有黑名單形式。

  判斷方式:在瀏覽加載文件,但還未點擊上傳按鈕時便彈出對話框,內容如:只允許上傳.jpg/.jpeg/.png後綴名的文件,而此時並沒有發送數據包。

wKiom1gPRZnwJlKcAAFFIbfqp7E577.png

客戶端繞過  

可以利用burp抓包改包,先上傳一個gif類型的***,然後通過burp將其改爲asp/php/jsp後綴名即可。

 

 

 

2.服務端校驗

2.1 content-type字段校驗  

wKiom1gPRbyCZw3dAAFAJRkNdZA760.png


文件類型繞過

我們可以通過抓包,將content-type字段改爲p_w_picpath/gif

 

 

 2.2 文件頭校驗  

可以通過自己寫正則匹配,判斷文件頭內容是否符合要求,這裏舉幾個常見的文件頭對應關係:

1)  .JPEG;.JPE;.JPG,”JPGGraphic File”

2)  .gif,”GIF 89A”

3)  .zip,”Zip Compressed”

4)  .doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”

 

文件頭繞過  

在***內容基礎上再加了一些文件信息,有點像下面的結構

GIF89a<?php phpinfo(); ?>

 

 

2.3 擴展名驗證

 MIME驗證

MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用於指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。 

它是一個互聯網標準,擴展了電子郵件標準,使其能夠支持: 

ASCII字符文本;非文本格式附件(二進制、聲音、圖像等);由多部分(multiple parts)組成的消息體;包含非ASCII字符的頭信息(Header information)。 

這個標準被定義在RFC 2045RFC 2046RFC 2047RFC 2048RFC 2049RFC中。 MIME改善了由RFC 822轉變而來的RFC 2822,這些舊標準規定電子郵件標準並不允許在郵件消息中使用7ASCII字符集以外的字符。正因如此,一些非英語字符消息和二進制文件,圖像,聲音等非文字消息原本都不能在電子郵件中傳輸(MIME可以)MIME規定了用於表示各種各樣的數據類型的符號化方法。 此外,在萬維網中使用的HTTP協議中也使用了MIME的框架,標準被擴展爲互聯網媒體類型。

MIME的作用

使客戶端軟件區分不同種類的數據,例如web瀏覽器就是通過MIME類型來判斷文件是GIF圖片,還是可打印的PostScript文件。 Web服務器使用MIME來說明發送數據的種類,Web客戶端使用MIME來說明希望接收到的數據種類。

 

一個普通的文本郵件的信息包含一個頭部分(To: From: Subject: 等等)和一個體部分(Hello Mr.,等等)。在一個符合MIME的信息中,也包含一個信息頭並不奇怪,郵件的各個部分叫做MIME段,每段前也綴以一個特別的頭。MIME郵件只是基於RFC 822郵件的一個擴展,然而它有着自己的RFC規範集。

 

頭字段:MIME頭根據在郵件包中的位置,大體上分爲MIME信息頭和MIME段頭。(MIME信息頭指整個郵件的頭,而MIME段頭只每個MIME段的頭。)


常見MIME類型

wKioL1gPRduyysyVAADQDRB0IVw372.png


mimntype判斷

 一般先判斷內容的前十個字節,來判斷文件類型,然後再判斷後綴名。


文件擴展名繞過

前提:黑名單校驗

黑名單檢測:一般有個專門的 blacklist 文件,裏面會包含常見的危險腳本文件。

繞過方法:

1)找黑名單擴展名的漏網之魚 比如 asa 和 cer 之類

2)可能存在大小寫繞過漏洞 比如 aSp 和 pHp 之類

能被解析的文件擴展名列表:

jsp  jspx  jspf

asp  asa cer aspx

 

 

 

三、配合文件包含漏洞

前提:校驗規則只校驗當文件後綴名爲asp/php/jsp的文件內容是否爲***。

繞過方式:(這裏拿php爲例,此漏洞主要存在於PHP中)

1)先上傳一個內容爲***的txt後綴文件,因爲後綴名的關係沒有檢驗內容;

2)然後再上傳一個.php的文件,內容爲<?php Include(“上傳的txt文件路徑”);?>

此時,這個php文件就會去引用txt文件的內容,從而繞過校驗,下面列舉包含的語法:

 

2linux下後綴名大小寫

linux下,如果上傳php不被解析,可以試試上傳pHp後綴的文件名。


如上傳一句話圖片***,大司令未被執行,可以使用包含漏洞,調出一句話圖片***,代碼被執行。

wKiom1gPSKjQ-LPmAAC_S3ndX-8681.png

 

CMS、編輯器漏洞

1CMS漏洞:比如說JCMS等存在的漏洞,可以針對不同CMS存在的上傳漏洞進行繞過。

2)編輯器漏洞:比如FCKewebeditor等,可以針對編輯器的漏洞進行繞過。

這兩方面的漏洞以後單獨成文彙總,這裏點到爲止。

 

配合其他規則

10x00截斷:基於一個組合邏輯漏洞造成的,通常存在於構造上傳文件路徑的時候

test.php(0x00).jpg

test.php%00.jpg

  路徑/upload/1.php(0x00),文件名1.jpg,結合/upload/1.php(0x00)/1.jpg



四、WAF繞過

1、 垃圾數據  

有些主機WAF軟件爲了不影響web服務器的性能,會對校驗的用戶數據設置大小上限,比如1M。此種情況可以構造一個大文件,前面1M的內容爲垃圾內容,後面纔是真正的***內容,便可以繞過WAF對文件內容的校驗

wKioL1gPRl7x6j39AAAXPphUSDw947.png


當然也可以將垃圾數據放在數據包最開頭,這樣便可以繞過對文件名的校驗。


2、 filename

針對早期版本安全狗,可以多加一個filename

wKioL1gPRnfzvb7MAAAVheV5Fuo451.png


、3 POST/GET

有些WAF的規則是:如果數據包爲POST類型,則校驗數據包內容。

此種情況可以上傳一個POST型的數據包,抓包將POST改爲GET。

8.4 以上方式

針對WAF,以上介紹的服務器解析漏洞、文件包含漏洞等都可以嘗試繞過。

 


 五、設計安全的文件上傳功能

1、文件上傳的目錄設置爲不可執行

2、判斷文件類型:強烈推薦白名單方式。此外,對於圖片的處理,可以使用壓縮函數或者resize函數,在處理圖片的同時破壞圖片中可能包含的HTML代碼。

3、使用隨機數改寫文件名和文件路徑:一個是上傳後無法訪問;再來就是像shell.php.rar.rarcrossdomain.xml這種文件,都將因爲重命名而無法***。

4、單獨設置文件服務器的域名:由於瀏覽器同源策略的關係,一系列客戶端***將失效,比如上傳crossdomain.xml、上傳包含JavascriptXSS利用等問題將得到解決。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章