1. 程式人生 > >文件上傳的思考 (轉) http://blog.csdn.net/ncafei/article/details/53401961

文件上傳的思考 (轉) http://blog.csdn.net/ncafei/article/details/53401961

內容 html csdn 大小寫 eva 最大 設備 改變 tar

文件上傳校驗

客戶端JavaScript校驗(一般只校驗後綴名)

一般都是在網頁上寫一段javascript腳本,校驗上傳文件的後綴名,有白名單形式也有黑名單形式。
  判斷方式:在瀏覽加載文件,但還未點擊上傳按鈕時便彈出對話框,內容如:只允許上傳.jpg/.jpeg/.png後綴名的文件,而此時並沒有發送數據包。

服務端校驗:

1、文件頭content-type字段校驗(image/gif):代碼對上傳文件的文件類型進行了判斷,如果不是圖片類型,返回錯誤。

2、文件內容頭校驗(GIF89a):

可以通過自己寫正則匹配,判斷文件頭內容是否符合要求,這裏舉幾個常見的文件頭對應關系:
(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”

3、後綴名黑名單校驗,後綴名白名單校驗,自定義正則校驗,WAF設備校驗(根據不同的WAF產品而定)

文件上傳繞過校驗

客戶端繞過(抓包改包) 服務端繞過 文件類型 文件頭 文件後綴名 配合文件包含漏洞繞過 配合服務器解析漏洞繞過 CMS、編輯器漏洞繞過 配合操作系統文件命名規則繞過 配合其他規則繞過 WAF繞過

1.客戶端繞過

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

2.服務端繞過

2.1 文件類型繞過

  我們可以通過抓包,將content-type字段改為image/gi

2.2 文件頭繞過

  在木馬內容基礎上再加了一些文件信息,有點像下面的結構
GIF89a<?php phpinfo(); ?>

2.3 文件後綴名繞過

前提:黑名單校驗
黑名單檢測:一般有個專門的 blacklist 文件,裏面會包含常見的危險腳本文件。
繞過方法:
(1)找黑名單擴展名的漏網之魚 - 比如 asa 和 cer 之類
(2)可能存在大小寫繞過漏洞 - 比如 aSp 和 pHp 之類
能被解析的文件擴展名列表:
jsp jspx jspf
asp asa cer aspx
php php php3 php4
exe exee

3.配合文件包含漏洞

前提:校驗規則只校驗當文件後綴名為asp/php/jsp的文件內容是否為木馬。
繞過方式:(這裏拿php為例,此漏洞主要存在於PHP中)
(1)先上傳一個內容為木馬的txt後綴文件,因為後綴名的關系沒有檢驗內容;
(2)然後再上傳一個.php的文件,內容為<?php Include(“上傳的txt文件路徑”);?>
此時,這個php文件就會去引用txt文件的內容,從而繞過校驗,

下面列舉包含的語法:

#PHP

<?php Include("上傳的txt文件路徑");?>

#ASP

<!--#include file="上傳的txt文件路徑" -->

#JSP

<jsp:inclde page="上傳的txt文件路徑"/>

or

<[email protected] file="上傳的txt文件路徑"%>

4.配合服務器解析漏洞

詳細可參考:http://thief.one/2016/09/21/服務器解析漏洞/

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

(1)上傳不符合windows文件命名規則的文件名
  test.asp.
  test.asp(空格)
  test.php:1.jpg
  test.php::$DATA
  shell.php::$DATA…….
會被windows系統自動去掉不符合規則符號後面的內容。

(2)Linux下後綴名大小寫
在linux下,如果上傳php不被解析,可以試試上傳pHp後綴的文件名。

6.CMS、編輯器漏洞

(1)CMS漏洞:比如說JCMS等存在的漏洞,可以針對不同CMS存在的上傳漏洞進行繞過。
(2)編輯器漏洞:比如FCK,ewebeditor等,可以針對編輯器的漏洞進行繞過。
這兩方面的漏洞以後單獨成文匯總,這裏點到為止。

7.配合其他規則

(1)0x00截斷:基於一個組合邏輯漏洞造成的,通常存在於構造上傳文件路徑的時候
  test.php(0x00).jpg
  test.php%00.jpg

路徑/upload/1.php(0x00),文件名1.jpg,結合/upload/1.php(0x00)/1.jpg
偽代碼演示:

name= getname(httprequest) //假如這時候獲取到的文件名是 help.asp.jpg(asp 後面為 0x00)

type =gettype(name) //而在 gettype()函數裏處理方式是從後往前掃描擴展名,所以判斷為 jpg

if(type == jpg)

SaveFileToPath(UploadPath.name, name) //但在這裏卻是以 0x00 作為文件名截斷

//最後以 help.asp 存入路徑裏

8.WAF繞過

8.1 垃圾數據

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

當然也可以將垃圾數據放在數據包最開頭,這樣便可以繞過對文件名的校驗。可以將垃圾數據加上Content-Disposition參數後面,參數內容過長,可能會導致waf檢測出錯

8.2 filename

針對早期版本安全狗,可以多加一個filename或者將filename換位置,在IIS6.0下如果我們換一種書寫方式,把filename放在其他地方:

8.3 POST/GET

有些WAF的規則是:如果數據包為POST類型,則校驗數據包內容。
此種情況可以上傳一個POST型的數據包,抓包將POST改為GET。

8.4 以上方式

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

8.5 利用waf本身缺陷
刪除實體裏面的Conten-Type字段

第一種是刪除Content整行,第二種是刪除C後面的字符。刪除掉ontent-Type: image/jpeg只留下c,將.php加c後面即可,但是要註意額,雙引號要跟著c.php。

正常包:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png

構造包:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png

C.php"

刪除Content-Disposition字段裏的空格

增加一個空格導致安全狗被繞過案列:
Content-Type: multipart/form-data; boundary=—————————471****1141173****525****99
嘗試在boundary後面加個空格或者其他可被正常處理的字符:
boundary= —————————471****1141173****525****50

修改Content-Disposition字段值的大小寫
Boundary邊界不一致

每次文件上傳時的Boundary邊界都是一致的:

Content-Type: multipart/form-data; boundary=---------------------------471****1141173****525****99

Content-Length: 253

-----------------------------471****1141173****525****99

Content-Disposition: form-data; name="file1"; filename="shell.asp"

Content-Type: application/octet-stream

<%eval request("a")%>

-----------------------------471****1141173****525****99--

但如果容器在處理的過程中並沒有嚴格要求一致的話可能會導致一個問題,兩段Boundary不一致使得waf認為這段數據是無意義的,可是容器並沒有那麽嚴謹:
Win2k3 + IIS6.0 + ASP

文件名處回車

多個Content-Disposition

在IIS的環境下,上傳文件時如果存在多個Content-Disposition的話,IIS會取第一個Content-Disposition中的值作為接收參數,而如果waf只是取最後一個的話便會被繞過,Win2k8 + IIS7.0 + PHP

利用NTFS ADS特性

ADS是NTFS磁盤格式的一個特性,用於NTFS交換數據流。在上傳文件時,如果waf對請求正文的filename匹配不當的話可能會導致繞過。

其他情況補充

文件重命名繞過

如果web程序會將filename除了擴展名的那段重命名的話,那麽還可以構造更多的點、符號等等。

特殊的長文件名繞過

文件名使用非字母數字,比如中文等最大程度的拉長,不行的話再結合一下其他的特性進行測試:
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg

反刪除

將下圖file1改成了file4,這樣就不會把這個文件刪除了。(JCMS漏洞)

文件校驗的幾點建議

  • 文件擴展名服務端白名單校驗。

  • 文件內容服務端校驗。

  • 上傳文件重命名。

  • 隱藏上傳文件路徑。

  以上幾點,可以防禦絕大多數上傳漏洞,但是需要跟服務器容器結合起來。如果解析漏洞依然存在,那麽沒有絕對的安全。

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

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

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

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.*這類文件,打開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

文件上傳的思考 (轉) http://blog.csdn.net/ncafei/article/details/53401961