檔案上傳漏洞是指使用者上傳了一個可執行的腳本檔案,并通過此腳本檔案獲得了執行伺服器端指令的能力。這種攻擊方式是最為直接和有效的,“檔案上傳”本身沒有問題,有問題的是檔案上傳後,伺服器怎麼處理、解釋檔案。如果伺服器的處理邏輯做的不夠安全,則會導緻嚴重的後果。
檔案上傳後導緻的常見安全問題一般有:
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為例,其檔案上傳功能在:
(一)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.*這類檔案,打開apache的httpd.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_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,是以就會将phpinfo.jpg作為PHP檔案來解析了
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/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
<a href="http://s2.51cto.com/wyfs02/M02/89/50/wKiom1gPRHviHFZEAAF8il_CHak871.png" target="_blank"></a>
點選Create Folder建立檔案夾
<a href="http://s5.51cto.com/wyfs02/M00/89/4E/wKioL1gPRLKhrsxJAAEs7-iaawU576.png" target="_blank"></a>
用brup suite進行改包,将%2F改為a.asp。
<a href="http://s3.51cto.com/wyfs02/M02/89/4E/wKioL1gPRNKh4kGwAACUjUtp1yU968.png" target="_blank"></a>
點選Get Folders獲得檔案夾。
<a href="http://s2.51cto.com/wyfs02/M00/89/4E/wKioL1gPRSrhI-p9AACHReJicYA006.png" target="_blank"></a>
上傳檔案,我這裡上傳了一句話圖檔木馬,然後能看到上傳的路徑,通路的是1.asp/FI201610191827336199.jpg,會被當作asp執行,用菜刀連接配接getshell。
<a href="http://s5.51cto.com/wyfs02/M01/89/4E/wKioL1gPRUXiaZybAACPcJnRUEY833.png" target="_blank"></a>
二、繞過檔案上傳檢查功能
一般都是通過檔案名字尾檢查。但是在某些時候,攻擊者手動修改了上傳過程中的POST包,在檔案名後添加一個%00位元組額,則可以截斷某些函數對檔案名的判斷。因為在許多語言的函數中,比如在C、PHP等語言的常用字元串處理函數中,0x00被認為是終止符。受此影響的環境有Web應用和一些伺服器。比如應用原本隻允許上傳JPG圖檔,那麼可以構造檔案名為xxx.php[\0].JPG,其中[\0]為十六進制的0x00字元,.JPG繞過了應用的上傳檔案類型判斷;但對于伺服器來說,此檔案因為0x00字元截斷的關系,最終卻變成了xxx.php。
1.用戶端校驗
一般都是在網頁上寫一段javascript腳本,校驗上傳檔案的字尾名,有白名單形式也有黑名單形式。
判斷方式:在浏覽加載檔案,但還未點選上傳按鈕時便彈出對話框,内容如:隻允許上傳.jpg/.jpeg/.png字尾名的檔案,而此時并沒有發送資料包。
<a href="http://s4.51cto.com/wyfs02/M02/89/51/wKiom1gPRZnwJlKcAAFFIbfqp7E577.png" target="_blank"></a>
用戶端繞過
可以利用burp抓包改包,先上傳一個gif類型的木馬,然後通過burp将其改為asp/php/jsp字尾名即可。
2.服務端校驗
2.1 content-type字段校驗
<a href="http://s3.51cto.com/wyfs02/M02/89/51/wKiom1gPRbyCZw3dAAFAJRkNdZA760.png" target="_blank"></a>
檔案類型繞過
我們可以通過抓包,将content-type字段改為image/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 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。 MIME改善了由RFC 822轉變而來的RFC 2822,這些舊标準規定電子郵件标準并不允許在郵件消息中使用7位ASCII字元集以外的字元。正因如此,一些非英語字元消息和二進制檔案,圖像,聲音等非文字消息原本都不能在電子郵件中傳輸(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類型
<a href="http://s3.51cto.com/wyfs02/M02/89/4E/wKioL1gPRduyysyVAADQDRB0IVw372.png" target="_blank"></a>
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檔案的内容,進而繞過校驗,下面列舉包含的文法:
(2)linux下字尾名大小寫
在linux下,如果上傳php不被解析,可以試試上傳pHp字尾的檔案名。
如上傳一句話圖檔木馬,大司令未被執行,可以使用包含漏洞,調出一句話圖檔木馬,代碼被執行。
<a href="http://s3.51cto.com/wyfs02/M01/89/51/wKiom1gPSKjQ-LPmAAC_S3ndX-8681.png" target="_blank"></a>
CMS、編輯器漏洞
(1)CMS漏洞:比如說JCMS等存在的漏洞,可以針對不同CMS存在的上傳漏洞進行繞過。
(2)編輯器漏洞:比如FCK,ewebeditor等,可以針對編輯器的漏洞進行繞過。
這兩方面的漏洞以後單獨成文彙總,這裡點到為止。
配合其他規則
(1)0x00截斷:基于一個組合邏輯漏洞造成的,通常存在于構造上傳檔案路徑的時候
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對檔案内容的校驗
<a href="http://s3.51cto.com/wyfs02/M00/89/4E/wKioL1gPRl7x6j39AAAXPphUSDw947.png" target="_blank"></a>
當然也可以将垃圾資料放在資料包最開頭,這樣便可以繞過對檔案名的校驗。
2、 filename
針對早期版本安全狗,可以多加一個filename
<a href="http://s3.51cto.com/wyfs02/M00/89/4E/wKioL1gPRnfzvb7MAAAVheV5Fuo451.png" target="_blank"></a>
、3 POST/GET
有些WAF的規則是:如果資料包為POST類型,則校驗資料包内容。
此種情況可以上傳一個POST型的資料包,抓包将POST改為GET。
8.4 以上方式
針對WAF,以上介紹的伺服器解析漏洞、檔案包含漏洞等都可以嘗試繞過。
五、設計安全的檔案上傳功能
1、檔案上傳的目錄設定為不可執行
2、判斷檔案類型:強烈推薦白名單方式。此外,對于圖檔的處理,可以使用壓縮函數或者resize函數,在處理圖檔的同時破壞圖檔中可能包含的HTML代碼。
3、使用随機數改寫檔案名和檔案路徑:一個是上傳後無法通路;再來就是像shell.php.rar.rar和crossdomain.xml這種檔案,都将因為重命名而無法攻擊。
4、單獨設定檔案伺服器的域名:由于浏覽器同源政策的關系,一系列用戶端攻擊将失效,比如上傳crossdomain.xml、上傳包含Javascript的XSS利用等問題将得到解決。
本文轉自 wt7315 51CTO部落格,原文連結:http://blog.51cto.com/wt7315/1865580