任意文件上傳:簡單概述
任意文件上傳分為兩大類:? 客戶端? ? 服務端
客戶端 (前端繞過):js檢查
服務端(后端繞過):后綴檢查----(黑名單辕羽,白名單)似扔, 內(nèi)容檢查吨些, 其他---(條件競爭)。?
實戰(zhàn)測試
1炒辉、客戶端檢測繞過(javascript 檢測)
? ? ? 首先觀察到提示只允許上傳圖片文件豪墅,那么前端的查看代碼,當頁面發(fā)生改變時黔寇,會調(diào)用這個checkFileExt函數(shù)來檢查上傳的是不是圖片偶器,我們只需要在前端將checkFileExt函數(shù)刪除,就能上傳一個一個非圖片文件。
2屏轰、服務端驗證繞過(MIME 類型檢測)
? ? ? MIME(Multipurpose Internet Mail Extensions)多用途互聯(lián)網(wǎng)郵件擴展類型颊郎。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候霎苗,瀏覽器會自動使用指定應用程序來打開姆吭。多用于指定一些客戶端自定義的文件名,以及一些媒體文件打開方式唁盏。
? ? ? 每個MIME類型由兩部分組成猾编,前面是數(shù)據(jù)的大類別,例如聲音audio升敲、圖象image等答倡,后面定義具體的種類。
常見的MIME類型(通用型):
超文本標記語言文本 .html text/html
xml文檔 .xml text/xml
XHTML文檔 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文檔 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG圖像 .png image/png
GIF圖形 .gif image/gif
JPEG圖形 .jpeg,.jpg image/jpeg
au聲音文件 .au audio/basic
MIDI音樂文件 mid,.midi audio/midi,audio/x-midi
RealAudio音樂文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二進制數(shù)據(jù) application/octet-stream
通過使用 PHP 的全局數(shù)組 $_FILES驴党,你可以從客戶計算機向遠程服務器上傳文件瘪撇。
第一個參數(shù)是表單的 input name,第二個下標可以是 "name", "type", "size", "tmp_name" 或 "error"港庄。就像這樣:
$_FILES["file"]["name"] - 被上傳文件的名稱
$_FILES["file"]["type"] - 被上傳文件的類型
$_FILES["file"]["size"] - 被上傳文件的大小倔既,以字節(jié)計
$_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱
$_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼
詳細可參考:http://www.w3school.com.cn/php/php_file_upload.asp
? ? ? 分析代碼邏輯:首先會獲取到前端的提交請求,然后定義了一個數(shù)組(定義圖片上傳指定類型)鹏氧,然后通過upload_sick函數(shù)對上傳的文件進行一定的檢查渤涌。
分析upload_sick函數(shù)存在漏洞的的原因是因為 $ _FILES() 這個全局的方法是通過瀏覽器http頭去獲取的content-type,content-type是前端用戶可以控制的把还。容易被繞過实蓬。
? ? 上傳一張正常的符合標準的圖片,對其content-type進行抓包操作吊履“仓澹可見正常上傳符合要求的圖片中數(shù)據(jù)包中content-type為image/png對比符合條件,而php文件則不符合條件返回文件類型錯誤艇炎。
三酌伊、代碼注入繞過--getimagesize()
? ? getimagesize() 函數(shù)用于獲取圖像大小及相關信息,成功返回一個數(shù)組缀踪,失敗則返回 FALSE 并產(chǎn)生一條 E_WARNING 級的錯誤信息居砖,如果用這個涵數(shù)來獲取類型,從而判斷是否是圖片的話驴娃,會存在問題奏候。
語法格式:
? ? array getimagesize ( string $filename [, array &$imageinfo ] )
getimagesize() 函數(shù)將測定任何 GIF,JPG托慨,PNG鼻由,SWF暇榴,SWC厚棵,PSD蕉世,TIFF,BMP婆硬,IFF狠轻,JP2,JPX彬犯,JB2向楼,JPC,XBM 或 WBMP 圖像文件的大小并返回圖像的尺寸以及文件類型及圖片高度與寬度谐区。
2湖蜕、文件包含漏洞之文件上傳漏洞利用
方法一:直接偽造頭部GIF89A
方法二:CMD方法,copy /b test.png+1.php muma.png
方法三:直接使用工具增加備注寫入一句話木馬宋列。
四昭抒、路徑/擴展名繞過
1、白名單
0x00截斷或test.asp%00.jpg
MIME繞過
2炼杖、黑名單
(1)文件名大小寫繞過
(2)名單繞過
? ? 用黑名單里沒有的名單進行攻擊冤狡,比如黑名單里沒有.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf|.htaccess后綴文件之類
(3)特殊文件名或文件夾繞過(windows)
? ? ? 還有比如發(fā)送的http 包里把文件名改成test.asp. 或test.asp_(下劃線為空格)略贮,這種命名方式在windows 系統(tǒng)里是不被允許的,所以需要在burp 之類里進行修改,然后繞過驗證后顿苇,會被windows 系統(tǒng)自動去掉后面的點和空格,但要注意Unix/Linux 系統(tǒng)沒有這個特性浮毯。
(4)0x00截斷
name = getname(http request) //假如這時候獲取到的文件名是test.asp .jpg(asp 后面為0x00)
type = gettype(name) //而在gettype()函數(shù)里處理方式是從后往前掃描擴展名媚污,所以判斷為jpg
if (type == jpg)
SaveFileToPath(UploadPath.name, name) //但在這里卻是以0x00 作為文件名截斷
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //最后以test.asp 存入路徑里
(5)把文件名改成test.asp. 或test.asp_(下劃線為空格),這種命名方式在windows 系統(tǒng)里是不被允許的黔衡,所以需要在burp 之類里進行修改消约,然后繞過驗證后,會被windows 系統(tǒng)自動去掉后面的點和空格员帮,但要注意Unix/Linux 系統(tǒng)沒有這個特性或粮。
(6)雙后綴名繞過
(7)::$DATA繞過
? ? 是Windows下NTFS文件系統(tǒng)的一個特性,即NTFS文件系統(tǒng)的存儲數(shù)據(jù)流的一個屬性 DATA 時捞高,就是請求 a.asp 本身的數(shù)據(jù)氯材,如果a.asp 還包含了其他的數(shù)據(jù)流,比如 a.asp:lake2.asp硝岗,請求 a.asp:lake2.asp::$DATA氢哮,則是請求a.asp中的流數(shù)據(jù)lake2.asp的流數(shù)據(jù)內(nèi)容。
五型檀、中間件解析漏洞繞過(參考文檔)
IIS解析漏洞
Apache解析漏洞
.htaccess
? ? 配置文件LoadModule rewrite_module modules/mod_rewrite.so前的注釋去掉冗尤,尋找關鍵詞:AllowOverride,并把后面的參數(shù)從None全部改成All
Nginx解析漏洞
.htaccess文件解析
本地文件包含解析
六、安全防范
? ? ? 針對文件上傳漏洞的特點和必須具備的三個條件裂七,我們阻斷任何一個條件就可以達到組織文件上傳攻擊的目的:
1皆看、最有效的,將文件上傳目錄直接設置為不可執(zhí)行背零,對于Linux而言腰吟,撤銷其目錄的'x'權限;實際中很多大型網(wǎng)站的上傳應用都會放置在獨立的存儲上作為靜態(tài)文件處理徙瓶,一是方便使用緩存加速降低能耗毛雇,二是杜絕了腳本執(zhí)行的可能性;
2侦镇、文件類型檢查:強烈推薦白名單方式灵疮,結(jié)合MIME Type、后綴檢查等方式(即只允許允許的文件類型進行上傳)壳繁;此外對于圖片的處理可以使用壓縮函數(shù)或resize函數(shù)始藕,處理圖片的同時破壞其包含的HTML代碼;
3氮趋、使用隨機數(shù)改寫文件名和文件路徑伍派,使得用戶不能輕易訪問自己上傳的文件;
4剩胁、單獨設置文件服務器的域名诉植;