再上傳文件時有多種校驗方式,整體分爲客戶端和服務端校驗,其中還細化爲不少校驗方式,檢驗文件後綴,大小等。javascript
客戶端校驗:顧名思義就是在在用戶瀏覽器上用一段javascript代碼進行校驗php
判斷方式:對於要上傳的圖片,剛加載之後還沒點擊確認,就提示文件錯誤而此時並無發送數據包。java
突破方法:linux
1.直接在瀏覽器上禁用javascript代碼,取消驗證。
2.burp截斷改包
先將上傳的木馬後綴改成jpg,經過burpsuit抓取上傳的包,再將抓取的包中將jpg改成PHPweb
服務器端驗證
1.content-type字段校驗,filetype檢驗
content-type讀取的是上傳文件的後綴,抓包修改shell
將content-type字段改成image/gif進行繞過
2.文件頭校驗
能夠經過本身寫正則匹配,判斷文件頭內容是否符合要求,這裏舉幾個常見的文件頭對應關係:
(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」apache
文件頭繞過
在木馬內容基礎上再加了一些文件信息,有點像下面的結構
GIF89a<?php phpinfo(); ?>
3.擴展名驗證
MIME驗證
MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用於指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。
它是一個互聯網標準,擴展了電子郵件標準,使其可以支持:
非ASCII字符文本;非文本格式附件(二進制、聲音、圖像等);由多部分(multiple parts)組成的消息體;包含非ASCII字符的頭信息(Header information)。
這個標準被定義在RFC 204五、RFC 204六、RFC 204七、RFC 204八、RFC 2049等RFC中。 MIME改善了由RFC 822轉變而來的RFC 2822,這些舊標準規定電子郵件標準並不容許在郵件消息中使用7位ASCII字符集之外的字符。正因如此,一些非英語字符消息和二進制文件,圖像,聲音等非文字消息本來都不能在電子郵件中傳輸(MIME能夠)。MIME規定了用於表示各類各樣的數據類型的符號化方法。 此外,在萬維網中使用的HTTP協議中也使用了MIME的框架,標準被擴展爲互聯網媒體類型。
MIME的做用
使客戶端軟件區分不一樣種類的數據,例如web瀏覽器就是經過MIME類型來判斷文件是GIF圖片,仍是可打印的PostScript文件。 Web服務器使用MIME來講明發送數據的種類,Web客戶端使用MIME來講明但願接收到的數據種類。
一個普通的文本郵件的信息包含一個頭部分(To: From: Subject: 等等)和一個體部分(Hello Mr.,等等)。在一個符合MIME的信息中,也包含一個信息頭並不奇怪,郵件的各個部分叫作MIME段,每段前也綴以一個特別的頭。MIME郵件只是基於RFC 822郵件的一個擴展,然而它有着本身的RFC規範集。
頭字段:MIME頭根據在郵件包中的位置,大致上分爲MIME信息頭和MIME段頭。(MIME信息頭指整個郵件的頭,而MIME段頭只每一個MIME段的頭。)
常見MIME類型瀏覽器
mimntype判斷
通常先判斷內容的前十個字節,來判斷文件類型,而後再判斷後綴名。
文件擴展名繞過
前提:黑名單校驗
黑名單檢測:通常有個專門的 blacklist 文件,裏面會包含常見的危險腳本文件。
繞過方法:
(1)找黑名單擴展名的漏網之魚 - 好比 asa 和 cer 之類
(2)可能存在大小寫繞過漏洞 - 好比 aSp 和 pHp 之類
能被解析的文件擴展名列表:
jsp jspx jspf
asp asa cer aspx
4.配合文件包含漏洞
前提:校驗規則只校驗當文件後綴名爲asp/php/jsp的文件內容是否爲木馬。
繞過方式:(這裏拿php爲例,此漏洞主要存在於PHP中)
(1)先上傳一個內容爲木馬的txt後綴文件,由於後綴名的關係沒有檢驗內容;
(2)而後再上傳一個.php的文件,內容爲「上傳的txt文件路徑」);?>
此時,這個php文件就會去引用txt文件的內容,從而繞過校驗,下面列舉包含的語法:
(2)linux下後綴名大小寫
在linux下,若是上傳php不被解析,能夠試試上傳pHp後綴的文件名。
5.編輯器漏洞
(1)CMS漏洞:好比說JCMS等存在的漏洞,能夠針對不一樣CMS存在的上傳漏洞進行繞過。
(2)編輯器漏洞:好比FCK,ewebeditor等,能夠針對編輯器的漏洞進行繞過。
這兩方面的漏洞之後單獨成文彙總,這裏點到爲止。
配合其餘規則
(1)0x00截斷:基於一個組合邏輯漏洞形成的,一般存在於構造上傳文件路徑的時候
test.php(0x00).jpg
test.php%00.jpg
路徑/upload/1.php(0x00),文件名1.jpg,結合/upload/1.php(0x00)/1.jpg
6.檢測黑名單類型的繞過(服務端)
將危險的後綴名寫到一個文件裏面,禁止指着後綴名的文件執行
文件名繞過:
大小寫組合繞過pHp,PhP,混搭繞過php1,php2,php3,php4,php5
列表名繞過:
cer,ashx,asa,cer,cdx,htr,繞過(黑名單可能會漏掉的)
特殊字符繞過:
a.asp改爲a.asp_
0x00截斷繞過:
上傳1.php.jpg burp抓包改爲1.php%00.jpg,或者hex–>20改爲00當解析的時候,看到空格,後面的那段就不解析了
或者upload/1.asp(空格)/上傳,hex修改20–>00繞過上傳
apache解析繞過:
help.asp.134.×2,從前向後嘗試解析,直到遇到本身認識的擴展名爲止。
雙擴展名解析繞過:
apache的conf配置有AddHandler php5-script.php沒有註釋掉,
則,文件名1.php.jpg就能看成php執行
.htaccess文件攻擊:
自定義.htaccess上傳,下面是內容
<FileMatch 「aaa」>
SetHandler application/x-httpd-php
</FileMatch>
同目錄下,上傳一個aaa文件,沒有擴展名,內容是一句話,這個時候就成功繞過。安全
7.檢測白名單類型的繞過(服務端)服務器
解析漏洞繞過
iis6.0解析繞過:
目錄繞過:
IIS6.0目錄路徑檢測解析,文件的名字爲「*.asp/xxx.jpg」一樣唄解析成asp
burp進行抓包,其中Content-Disposition:form-data;name=」path」咱們把本來的 upload/ 改成 uploading/1.asp/,filename=」yijuhua.asp」修改成filename=」yijuhua.asp/1.jpg」。
或者建立文件夾a.php裏面放一句話圖片1.jpg a.php/1.jpg—>php執行
文件繞過:
首先咱們請求 /aaa.php;xxx.jpg,從頭部查找查找 「.」號,得到 .php;xxx.jpg
查找」;」,若是有則內容截斷,因此/aaa.php;xxx.jpg會當作/aaa.php進行解析,除此以外咱們還有下面的構造方式繞過:a.php;.jpg,a.php;jpg–>php執行
iis7.0/7.5解析繞過:
在默認Fast-CGI開啓的狀況下上傳一個文件1.jpg
內容:<?php fputs(fopen(‘shell.php’,’w’),'<?php eval($_POST[cmd])?>’);?>
而後訪問1.jpg/.php 這樣就會在同級目錄下生成木馬shell.php
Nginx<8.0.3解析繞過:
上傳1.jpg—-burp修改–>1.jpg%00.php空字節繞過上傳
apache解析繞過:
a.php.x1.x2 apache從前向後嘗試解析,直到遇到本身認識的擴展名爲止。
.htaccess文件攻擊:自定義.htaccess繞過
<FileMatch 「aaa」>
SetHandler application/x-httpd-php
</FileMatch>
同目錄下,上傳一個aaa文件,沒有擴展名,而後內容是「aaa」+一句話,成功繞過。
8.自動修改後綴的繞過:
上傳php,服務端自動修改爲了gif
burp抓包,1.php–>修改爲1.pphphp成功繞過
設計安全的文件上傳功能一、文件上傳的目錄設置爲不可執行二、判斷文件類型:強烈推薦白名單方式。此外,對於圖片的處理,可使用壓縮函數或者resize函數,在處理圖片的同時破壞圖片中可能包含的HTML代碼。三、使用隨機數改寫文件名和文件路徑:一個是上傳後沒法訪問;再來就是像shell.php.rar.rar和crossdomain.xml這種文件,都將由於重命名而沒法攻擊。四、單獨設置文件服務器的域名:因爲瀏覽器同源策略的關係,一系列客戶端攻擊將失效,好比上傳crossdomain.xml、上傳包含Javascript的XSS利用等問題將獲得解決。