標題:文件上傳漏洞詳解

taibeihacker

Moderator

0x01 上传漏洞定义​

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

0x02 上传漏洞危害​

1.上傳文件是Web腳本語言,服務器的Web容器解釋並執行了用戶上傳的腳本,導致代碼執行。
2.上傳文件是病毒或者木馬時,主要用於誘騙用戶或者管理員下載執行或者直接自動運行;
3.上傳文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在該域下的行為(其他通過類似方式控制策略文件的情況類似);
4.上傳文件是病毒、木馬文件,黑客用以誘騙用戶或者管理員下載執行。
5.上傳文件是釣魚圖片或為包含了腳本的圖片,在某些版本的瀏覽器中會被作為腳本執行,被用於釣魚和欺詐。
除此之外,還有一些不常見的利用方法,比如將上傳文件作為一個入口,溢出服務器的後台處理程序,如圖片解析模塊;或者上傳一個合法的文本文件,其內容包含了PHP腳本,再通過'本地文件包含漏洞(Local File Include)'執行此腳本;等等。

0x03 上传漏洞满足条件​

首先,上傳的文件能夠被Web容器解釋執行。所以文件上傳後所在的目錄要是Web容器所覆蓋到的路徑。
其次,用戶能夠從Web上訪問這個文件。如果文件上傳了,但用戶無法通過Web訪問,或者無法得到Web容器解釋這個腳本,那麼也不能稱之為漏洞。
最後,用戶上傳的文件若被安全檢查、格式化、圖片壓縮等功能改變了內容,則也可能導致攻擊不成功。

0x04 上传漏洞产生的原因​

一些web應用程序中允許上傳圖片,文本或者其他資源到指定的位置,文件上傳漏洞就是利用這些可以上傳的地方將惡意代碼植入到服務器中,再通過url去訪問以執行代碼.
造成文件上傳漏洞的原因是:
1.服務器配置不當
2.開源編輯器上傳漏洞
3.本地文件上傳限制被繞過
4.過濾不嚴或被繞過
5.文件解析漏洞導致文件執行
6.文件路徑截斷

0x05 上传漏洞的原理​

大部分的網站和應用系統都有上傳功能,一些文件上傳功能實現代碼沒有嚴格限制用戶上傳的文件後綴以及文件類型,導致允許攻擊者向某個可通過Web訪問的目錄上傳任意PHP文件,並能夠將這些文件傳遞給PHP解釋器,就可以在遠程服務器上執行任意PHP腳本。
當系統存在文件上傳漏洞時攻擊者可以將病毒,木馬,WebShell,其他惡意腳本或者是包含了腳本的圖片上傳到服務器,這些文件將對攻擊者後續攻擊提供便利。根據具體漏洞的差異,此處上傳的腳本可以是正常後綴的PHP,ASP以及JSP腳本,也可以是篡改後綴後的這幾類腳本。

0x06 上传文件检测流程​

通常一個文件以HTTP協議進行上傳時,將以POST請求發送至Web服務器,Web服務器接收到請求並同意後,用戶與Web服務器將建立連接,並傳輸數據。一般文件上傳過程中將會經過如下幾個檢測步驟:
一般一個文件上傳過程中的檢測如下圖紅色標記部分:
fdnwj12xx0o22418.png

客戶端javascript校驗(一般只校驗文件的擴展名)
服務端校驗
文件頭content-type字段校驗(image/gif)
文件內容頭校驗(GIF89a)
目錄路經檢測(檢測跟Path參數相關的內容)
文件擴展名檢測(檢測跟文件extension 相關的內容)
後綴名黑名單校驗
後綴名白名單校驗
自定義正則校驗
WAF設備校驗(根據不同的WAF產品而定)
0x07
上傳漏洞繞過

1.客服端绕过​

(1)客户端校验: 一般都是在網頁上寫一段javascript腳本,校驗上傳文件的後綴名,有白名單形式也有黑名單形式。判斷方式:在瀏覽加載文件,但還未點擊上傳按鈕時便彈出對話框,內容如:只允許上傳.jpg/.jpeg/.png後綴名的文件,而此時並沒有發送數據包
(2)绕过方法:1.通過火狐插件NOscript插件或者禁用IE中JS腳本
2.通過firbug插件元素審核修改代碼(如刪除onsubm:t=”return
checkFile()”事件)
3.通過firbug元素審核javascirpt腳本中添加上傳文件類型。
4.通過利用burp抓包改包,先上傳一個gif類型的木馬,然後通過burp將其改為asp/php/jsp後綴名即可
注意:這裡修改文件名字後,請求頭中的Content-Length的值也要改
演示如下:
fidder進行抓包攔截,先上傳一句話圖片木馬如bd2.jpg,然後抓包攔截改成bd2.php
vvp2zusadbg22419.png

2.服务端绕过​

(1)黑名单扩展名绕过​

黑名單檢測:一般有個專門的blacklist 文件,裡面會包含常見的危險腳本文件。繞過方法:
(1)找黑名單擴展名的漏網之魚- 比如iis6.0中的asa 和cer
(2)可能存在大小寫繞過漏洞-
比如aSp(iis6.0中可以) 和pHp(只能在小於php5.3.39中的linux中) 之中
(3)能被WEB容器解析的文件其他擴展名列表:
jsp, jspx ,jspf
asp asa cer cdx,htr,xml,html
aspx,ashx,asmx,asax,ascx
演示:php中的大小寫解析只能在linux
環境才能執行:
22oiqqhzeu422420.png

這裡不允許上傳php那麼可以上傳大小寫Php
aoec40dqshx22421.png

21cpsoljpj522422.png

1lp2ufz1bti22423.png

(2)黑名单特殊后缀名绕过(利用难度高)​

將Burpsuite截獲的數據包中backlion.php名字改為baclion.php4(php1,php2,php3,php4,php5),前提條件是http.conf中設置AddType application/x-httpd-php .php1(php的版本小於等於5.3.29以下)
rsbscsjnbms22424.png

(3)配合操作系统文件命名规则绕过​

在windows系統下,如果文件名以“.”或者空格作為結尾,系統會自動刪除“.”與空格,利用此特性也可以繞過黑名單驗證。 apache中可以利用點結尾和空格繞過,asp和aspx中可以用空格繞過
(a).上傳不符合windows文件命名規則的文件名, 會被windows系統自動去掉不符合規則符號後面的內容:
test.asp.
rhikydcg0aw22425.png

test.asp(空格)
jrka0j505mf22426.png

test.php:1.jpg
k1jkpx3thap22427.png

test.php:$DATA
z3hvadjiq3d22428.png

(b). linux下後綴名大小寫
在linux下,如果上傳php不被解析,可以試試上傳pHp後綴的文件名(前提條件是php版本小於等於5.3.29版本)
xu3pputzro122429.png

(4)单双重后缀名绕过​

上傳時將Burpsuite截的數據包中文件名backlion.php(backlion.asa)改為backlion.pphphph(backlion.asasaa),那麼過濾了第一個'php'字符串'後,開頭的'p'和結尾的'hp'就組合又形成了php

(5)服务端MIME文件类型(Content-Type)绕过​

MIME的作用:使客戶端軟件,區分不同種類的數據,例如web瀏覽器就是通過MIME類型來判斷文件是GIF圖片,還是可打印的PostScript文件。 web服務器使用MIME來說明發送數據的種類, web客戶端使用MIME來說明希望接收到的數據種類,它是服務器用來判斷瀏覽器傳遞文件格式的重要標記項。
常用的文件上传类型的MIME表:text/plain(純文本)
text/html(HTML文檔)
text/javascript(js代碼)
application/xhtml+xml(XHTML文檔)
image/gif(GIF圖像)
image/jpeg(JPEG圖像)
image/png(PNG圖像)
video/mpeg(MPEG動畫)
application/octet-stream(二進制數據)
application/pdf(PDF文檔)
application/(編程語言) 該種語言的代碼
application/msword(Microsoft
Word文件)
message/rfc822(RFC 822形式)
multipart/alternative(HTML郵件的HTML形式和純文本形式,相同內容使用不同形式表示)
application/x-www-form-urlencoded(POST方法提交的表單)
multipart/form-data(POST提交時伴隨文件上傳的表單)
绕过方法:上傳對文件類型做了限制,可通過burpsuit將其他類文件類型修改為如:Content-Type:image/gif和image/jpeg等運行的文件類型
y1qkw5am0hj22430.png

nerwexjkm4522431.png

zjwpiq5uuoe22432.png

(6)配合文件包含漏洞绕过​

绕过方式一:运行上传文件包含脚本木马和一句话内容马前提:校驗規則只校驗當文件後綴名為asp/php/jsp的文件內容是否為木馬。
(a)先上傳一個內容為木馬的txt後綴文件,因為後綴名的關係沒有檢驗內容;
(b)然後再上傳一個.php的文件,內容為?php Include(“上傳的txt文件路徑”);
此時,這個php文件就會去引用txt文件的內容,從而繞過校驗,下面列舉包含的語法:
PHP
?php Include('上傳的txt文件路徑');
ASP
!--#include file='上傳的txt文件路徑' --
JSP
jsp:inclde page='上傳的txt文件路徑'/
or
%@include file='上傳的txt文件路徑'%
pil0maxmmed22433.png

ubdrntqtxxx22434.png

方式二:存在本地文件包含漏洞,并可上传一句话内容马上傳一個符合條件格式的文檔,文檔內容為一句話木馬,eg:test.txt
利用文件包含漏洞包含上傳的木馬文件,eg:page?id=D:/www/test.txt

(7)修改 url 的参数绕过​

谷歌關鍵字:inurl:newslist.asp?NodeCode=
將/uploadfile.asp?uppath=PicPathupname=uptext=form1.PicPath中的參數uptext的值改為form1.PicPath.asp即可繞過。
可以看出對參數PicPath 進行了修改,這種漏洞主要是存在文件名或者路徑過濾不嚴,在實戰中多多觀察
url 中的參數,可以嘗試進行修改數據

(8)双重文件上传绕过​

通過保存以下代碼為1.html修改上傳:
form
action='http://edu2b.sinaapp.com/Upfile_AdPic.asp' method='post'
name='form1'
enctype='multipart/form‐data'
input name='FileName1' type='FILE' class='tx1' size='40'
input name='FileName2' type='FILE' class='tx1' size='40'
input type='submit' name='Submit' value='上傳'
/form
//在第一個框內選擇一個jpg 圖片,文件名為“yueyan.jpg”,在第
二個框內選擇一個cer 文件,文件名為“yueyan.cer”,點“上傳”把這兩個文件提交給程序即可。

3.白名单绕过:​

(1)配合Web容器的解析漏洞:​

IIS中的目錄解析漏洞和分號解析漏洞:
將一句話木馬的文件名backlion.php,改成backlion.php.abc(奇怪的不被解析的後綴名都
行)。首先,服務器驗證文件擴展名的時候,驗證的是.abc,只要該擴展名符合服務器端黑白名單規則,即可上傳。
nginx空字節漏洞xxx.jpg%00.php 這樣的文件名會被解析為php代碼運行
apache的解析漏洞,上傳如a.php.rar a.php.gif 類型的文件名,可以避免對於php文件的過濾機制,但是由於apache在解析文件名的時候是從右向左讀,如果遇到不能識別的擴展名則跳過,rar等擴展名是apache不能識別的,因此就會直接將類型識別為php,從而達到了注入php代碼的目的

(2)%00截断上传绕过​

通過抓包截斷將backlion.asp.jpg後面的一個.換成%00在上傳的時候即backlion.asp%00.jpg,當文件系統讀到%00時,會認為文件已經結束,從而將backlion.asp.jpg的內容寫入到backlion.asp中,從而達到攻擊的目的。 %00不是針對所有基於白名單的後綴名檢查都能繞過,代碼的實現過程中必須存在截斷上傳漏洞,上傳格式如下:
 bk.asp %00.jpg
 路徑/updata/bk.asp(0x00).jpg
y04xwj1bxw022435.png

lksw1iyqrdp22436.png

funzclajjmv22437.png

(4)突破文件路径绕过​

在文件上傳時,程序通常允許用戶將文件放到指定的目錄中,如果指定的目錄存在,就將文件寫入目錄中,不存在的話則先建立目錄,然後寫入。比如:在前端的HTML代碼中,有一個隱藏標籤input type='hidden'
name='Extension' value='up'/在服務器端有如下代碼if(!is_dir($Extension)){ //如果文件夾不存在,就建立文件夾
mkdir($Extension);
}
攻擊者可以利用工具將表單中value的值由“up”改為“pentest.asp”,並上傳一句話圖片木馬文件。程序在接收到文件後,對目錄判斷,如果服務器不存在pentest.asp目錄,將會建立此目錄,然後再將圖片一句話密碼文件寫入pentest.asp目錄,如果Web容器為IIS 6.0,那麼網頁木馬會被解析
以下目录位置修改绕过几种形式:upload/1.asp%00.jpg
#asp中的修改目錄位置%00的攔截
bk.jpg #post提交一句話圖片馬或者其他白名單為一句話木馬
-------upload/1.asp%00.jpg/bk.jpg #最終生成的文件訪問路徑
tmv2fyonle022438.png

--------------------------------------------------------------------------
upload/bk.asp/#
windows2003 iis6.0中目錄路徑後添加一個bk.asp的目錄
bk.jpg
#post上傳的文件類型為一句話圖片馬
-----upload/bk.asp/aaabbk.jpg #最終的URL訪問路徑
013cfywlhxc22439.png

----------------------------------------------------------------------------
upload/bk.asp; # windows2003 iis6.0中目錄路徑後添加一個bk.asp;的目錄
bk.jpg #post上傳的文件類型將bk.jpg一句話圖片馬
-----upload/bk.asp;14127900008.asp ##最終的URL訪問路徑
irdm14eizzz22440.png

這里以動網6.0為例,先上傳一個正常的圖片,會生成如:files/201210010321944973.jpg文件。第一種突破方法:先上傳一句話圖片馬如1.jpg,然後攔截將其FilePath 值改為“files/backlion.asp□
最終生成:“files/backlion.asp□/201210010321944973.jpg,實際就是files/backlion.asp
第二種突破:先上傳一句話圖片馬如1.jpg,然後攔截將其FilePath 值改為“backlion.asp;最終生成:“backlion.asp;201210010321944973.jpg
 
返回
上方