文件上傳漏洞:
1.本地驗證
本地驗證:客戶端本地通過前臺JS腳本進行檢測糊饱。
原理:
當用戶在客戶端選擇文件點擊上傳的時候,客戶端會在向服務(wù)器發(fā)送請求之前颠黎,就先對將上傳的本地文件類型進行檢測另锋,來判斷是否是可以上傳的類型,這種方式稱為前臺腳本檢測狭归,即本地驗證夭坪。
如何判斷是本地驗證呢?很多情況下感覺速度較快的返回信息則認為有可能是本地驗證过椎,但是有的時候需要根據(jù)抓報以及跟蹤上傳代碼來分析出是否為本地驗證室梅。
繞過:
繞過前臺腳本檢測擴展名,就是要使檢測函數(shù)失效。
- 可以繞過檢測規(guī)則亡鼠;
- 可以修改檢測規(guī)則赏殃;
- 在數(shù)據(jù)傳輸中修改數(shù)據(jù)包內(nèi)容。
1. 繞過檢測規(guī)則
檢查網(wǎng)頁源碼间涵,看能否找到文件上傳點附近調(diào)用檢測函數(shù)的痕跡仁热。
像這里我們能看到
onsubmit="return checkFile()"
就是調(diào)用了檢測函數(shù)。我們可以采取直接修改前臺代碼的方式勾哩。取消檢測函數(shù)的調(diào)用抗蠢,再進行文件上傳。
注意:這種修改只是在本地上修改钳幅,是臨時的物蝙,刷新頁面即可還原。
還有一種繞過方式敢艰,就是干脆在本地瀏覽器客戶端禁用JS诬乞。可使用火狐瀏覽器的NoScript插件钠导、IE中禁用掉JS等方式實現(xiàn)震嫉。
2. 修改檢測規(guī)則
檢查網(wǎng)頁源碼,看能否找到文件過濾函數(shù)牡属。
如果找到了票堵,我們就可以通過直接修改這個JS函數(shù),使它能夠上傳我們需要的文件逮栅。
注意:這種修改只是在本地上修改悴势,是臨時的,刷新頁面即可還原措伐。
3. 修改數(shù)據(jù)包
首先將所要上傳文件的擴展名更改為符合腳本檢測規(guī)則的擴展名特纤,通過BurpSuite等抓包工具,截取數(shù)據(jù)包侥加,并將數(shù)據(jù)包中文件擴展名更改為所需要的擴展名捧存,達到繞過的目的。
例如:文件名本來為【evil.jpg】担败,上傳時昔穴,用BurpSuite截包后,將數(shù)據(jù)包中的名字改為【evil.php】(或其它腳本類型)即可提前。
2.MIME類型檢測繞過漏洞
服務(wù)器端根據(jù) content-type 類型檢測吗货,如果是白名單允許的,則可以正常上傳岖研,否則上傳失敗卿操。
MIME
MIME:客戶端軟件警检,區(qū)分不同種類的數(shù)據(jù),例如web瀏覽器就是通過MIME類型來判斷文件是GIF圖片害淤,還是可打印的PostScript文件扇雕。web服務(wù)器使用MIME來說明發(fā)送數(shù)據(jù)的種類, web客戶端使用MIME來說明希望接收到的數(shù)據(jù)種類窥摄。
MIME檢測原理
服務(wù)端MIME類型檢測是通過檢查http包的Content-Type字段中的值來判斷上傳文件是否合法的镶奉。
php示例代碼:
<?php
if($_FILES['userfile']['type'] != "image/gif") {
//檢測Content-type
//當上傳文件的type不為`image/gif`時,程序不執(zhí)行文件保存操作崭放,直接退出哨苛。
//當上傳文件的type是`image/gif`時,程序跳出if語句币砂,執(zhí)行文件保存操作建峭。
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";
echo "File path is ".$uploadfile;
}
else
{
echo "File uploading failed.\n";
}
?>
示例代碼的功能是服務(wù)端用來處理文件上傳的,在第二行中if語句對上傳文件的type判斷是否為image/gif决摧。
在代碼中檢測的type值亿蒸,對應(yīng)http包中的字段Content-Type的值。也就是所我們可以偽裝上傳文件的type值掌桩,來繞過服務(wù)端的MIME檢測
繞過:
修改content-type 參數(shù)欺騙繞過边锁。
防御:
根據(jù)攻擊原理,有以下幾點應(yīng)該注意:
1:文件上傳的目錄設(shè)置為不可執(zhí)行
只要web容器無法解析該目錄下的文件波岛,即使攻擊者上傳了腳本文件茅坛,服務(wù)器本身也不會受到影響,因此此點至關(guān)重要则拷。實際中贡蓖,很多大型網(wǎng)站的上傳應(yīng)用,文件上傳后會放到獨立的儲存上煌茬,做靜態(tài)處理摩梧。但對一些小應(yīng)用,如果存在上傳功能宣旱,則仍需要多加關(guān)注
2:判斷文件類型:
判斷文件類型時,應(yīng)結(jié)合MIME Type叛薯、后綴檢查等方式浑吟。推薦使用白名單,黑名單的方式已經(jīng)無數(shù)次被證明不可靠耗溜。此外组力,針對圖片處理,可以使用壓縮函數(shù)或者resize函數(shù)抖拴,在處理圖片的同事破壞掉圖片中可能包含的HTML代碼燎字。
3:使用隨機數(shù)改寫文件名和文件路徑
文件上傳如果要執(zhí)行代碼腥椒,則需要用戶能夠訪問到這個文件。在某些環(huán)境中候衍,用戶能上傳笼蛛,但不能訪問。如果應(yīng)用使用隨機函數(shù)改寫了文件名和路徑蛉鹿,將極大增加攻擊成本滨砍。與此同時,像1.php.rar.rar妖异、或者1.xml這種文件惋戏,都因為文件名被改寫而無法成功實施攻擊
3. 文件擴展名繞過漏洞
應(yīng)用場景:服務(wù)端驗證繞過(擴展名檢測),一般用于繞過黑名單檢測他膳。
黑名單檢測 黑名單的安全性其實還沒白名單的安全性高响逢,至少攻擊它的方式比白名單多多了。
一般有個專門的 blacklist 文件棕孙,里面會包含常見的危險腳本文件舔亭。
1). 找黑名單擴展名的漏網(wǎng)之魚
比如上面就漏掉了 asa 和 cer 之類。
2). 可能存在大小寫繞過漏洞
比如 aSp 和 pHp 之類散罕。
用于只將小寫的腳本后綴名(如php)過濾掉的場合分歇。
3)雙寫后綴名繞過
用于只將文件后綴名,例如"php"字符串過濾的場合欧漱;
例如:上傳時將Burpsuite截獲的數(shù)據(jù)包中文件名【evil.php】改為【evil.pphphp】职抡,那么過濾了第一個"php"字符串"后,開頭的'p'和結(jié)尾的'hp'就組合又形成了【php】误甚。
4). 特別文件名構(gòu)造
比如發(fā)送的 http 包里把文件名改成 help.asp. 或 help.asp_(下劃線為空 格)缚甩,這種命名方式在 windows 系統(tǒng)里是不被允許的,所以需要在 burp 之類里進行修改窑邦,然 后繞過驗證后擅威,會被 windows 系統(tǒng)自動去掉后面的點和空格。
了解php擴展名解析原則
可以被解析成PHP文件的后綴名有php4冈钦,phtml郊丛,phps,等瞧筛。
通過修改后綴厉熟,繞過黑名單檢測。
5). IIS 或 nginx 文件名解析漏洞
關(guān)于解析漏洞较幌,詳見:http://blog.csdn.net/xavierdarkness/article/details/78118767
4.文件內(nèi)容檢測繞過類上傳漏洞
在真實圖片中插入一句話木馬揍瑟,繞過內(nèi)容檢測。
5. 空字節(jié)截斷目錄路徑檢測繞過類上傳漏洞 (00截斷)
即 利用文件系統(tǒng)00截斷—繞過
原理
在上傳的時候乍炉,當文件系統(tǒng)讀到 0x00 時绢片,會認為文件已經(jīng)結(jié)束滤馍。
利用00截斷就是利用程序員在寫程序時對文件的上傳路徑過濾不嚴格,產(chǎn)生0x00上傳截斷漏洞底循。
繞過方法
通過抓包截斷將【evil.php.jpg】后面的一個【.】換成【0x00】巢株。在上傳的時候,當文件系統(tǒng)讀到【0x00】時此叠,會認為文件已經(jīng)結(jié)束纯续,從而將【evil.php.jpg】的內(nèi)容寫入到【evil.php】中,從而達到攻擊的目的灭袁。
上傳漏洞防御:
1.客戶端檢測猬错,使用JS對上傳圖片檢測,包括文件大小茸歧、擴展名倦炒、文件類型等
2.服務(wù)端檢測,對文件大小软瞎、路徑逢唤、擴展名、類型涤浇、文件內(nèi)容檢測鳖藕、對文件重命名
3.其他限制,服務(wù)器端上傳目錄設(shè)置不可執(zhí)行權(quán)限只锭。
參考資料:
http://blog.csdn.net/c465869935/article/details/51800354
http://blog.csdn.net/xysoul/article/details/45306209