upload总结及一般处理思路步骤
Table of Contents
upload的一般的檢測手段及繞過方法總結:
一,前端的javascript檢測:
一般的繞過方法:
? ? ? ? 1,禁用前端的javascript檢測
? ? ? ? 2,直接F12,修改頁面中的js檢測代碼
? ? ? ? 3,用burp suite進行中間修改:
二,服務端的MIME檢測:
? ? ? ? ?1,修改multipart/form-data,
? ? ? ? ?2,修改content-type
三,服務端的文件后綴名檢測:
一般的檢測手段:
黑名單: 1,大小寫繞過
2,特殊文件(.htaccess文件)的繞過
3,截斷(0x00)繞過
4,利用系統特性繞過
5,Web Server解析漏洞繞過
IIS解析漏洞:
Nginx解析漏洞:
Apache解析漏洞:
白名單:1,截斷(0x00)繞過
? ? ? ? ? ? ? ?2,Web Server解析漏洞繞過
四,服務端的目錄路徑檢測:
一般的繞過方法:(條件:目錄路徑可控)
1,若路徑可控,則可以使用0x00或%00截斷來繞過。
2,利用web容器(Apache,Ngnix,IIS)的解析漏洞
五,服務端的文件內容的檢測:
一般的檢測手段:(以圖片上傳為例)
一般的繞過方法:(以圖片上傳為例)
1,文件幻數檢測繞過:
2,文件相關信息檢測繞過:
3,文件加載檢測(圖像渲染,二次渲染)繞過:
六,WAF檢測:
1,條件競爭
upload的一般的檢測手段及繞過方法總結:
文件上傳看起來是比較簡單的,其實不然,因為涉及到了很多的情況,并且比賽中往往是結合文件包含,sql注入等,所以往往還是非常難搞的啊!下面就只簡單梳理一下上傳的繞過檢測的方法,至于利用上傳的木馬,后門文件這里先不做討論
(水平有限,錯誤缺漏,歡迎大佬指摘!)
一,前端的javascript檢測:
該類檢測代碼直接寫在網頁中,一般提交后,立即有彈窗提示禁止上傳,就可以判斷為前端檢測,或者直接右鍵查看頁面源代碼也能看到javascript的檢測代碼
一般的檢測手段:文件后綴名檢測,文件大小檢測
一般的繞過方法:
? ? ? ? 1,禁用前端的javascript檢測
可以直接將瀏覽器上的javascript 按鍵關閉,如果使用的是 Chrome ,firefox瀏覽器的話可以下載一個插件 Noscript 隨時禁止js
? ? ? ? 2,直接F12,修改頁面中的js檢測代碼
? ? ? ? 3,用burp suite進行中間修改:
先寫一個一句話木馬1.php,先將文件名修改為允許上傳的后綴名(png,gif,jpg),然后再使用burp suite截取數據包,將后綴名修改為 php
二,服務端的MIME檢測:
MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。 是設定某種擴展名的文件用一種應用程序來打開的方式類型。 即在傳輸過程中標記文件類型的一種方法,也就是 HTTP 文件請求頭中的 Content-Type 。Content-Type(內容類型),一般是指網頁中存在的 Content-Type,用于定義網絡文件的類型和網頁的編碼,決定瀏覽器將以 什么形式、什么編碼讀取這個文件,這就是經常看到一些 PHP 網頁點擊的結果卻是 下載一個文件或一張圖片的原因。這個地方我一直有點模糊,
為什么有時看到的Content-Type為 multipart/form-data,application/x-www-form-urlencoded,application/json,
有時看到的Content-Type為:
- text/html : HTML格式
- text/plain :純文本格式
- text/xml : XML格式
- image/gif :gif圖片格式
- image/jpeg :jpg圖片格式
- image/png:png圖片格式
- application/octet-stream 二進制流數據 (常見的文件下載)
怎么說呢?
第一個是包的headers的content-type,指代的是數據的編碼方式
默認的是application/x-www-form-urlencoded,就會按照urlencode編碼數據
有時還會碰到?application/json,就是數據按照json的格式編碼
當為multipart/form-data 或者 Multipart/form-data時,代表在上傳文件,boundary是一個字符串,用來切分數據?
另一個代表上傳文件類型的content-type(我是這樣理解的)
例如當我們上傳一個php文件的時候,content-type為?application/octet-stream 二進制流數據
當上傳一個jpg圖片的時候 content-type為?image/jpeg :jpg圖片格式。。。。。
我們再文件上傳的時候說的content-type都是指的第二個content-type
他是根據文件的后綴名決定的,一般有這幾種:
- text/html : HTML格式
- text/plain :純文本格式
- text/xml : XML格式
- image/gif :gif圖片格式
- image/jpeg :jpg圖片格式
- image/png:png圖片格式
- application/xhtml+xml :XHTML格式
- application/xml: XML數據格式
- application/atom+xml :Atom XML聚合格式
- application/json: JSON數據格式
- application/pdf:pdf格式
- application/msword : Word文檔格式
- application/octet-stream : 二進制流數據(如常見的文件下載)
一般的檢測手段:
一般采取白名單的方式來進行檢測,如只能上傳圖像文件的話就Content-Type頭就必須為image/jpeg或image/png或image/gif。
一般的繞過方法:
? ? ? ? ?1,修改multipart/form-data,
一般文件上傳是不會對 headers中的 content-type做限制,因為上傳文件的時候它只會是?multipart/form-data或者Multipart/form-data,但不排除特殊情況,
例如 bugku中一個題: 求getshall
這個題有3個檢測點,1:headers中的content-type必須是 Multipart/form-data;2:第二個content-type必須是圖片類型即(image/png,image/jpeg);3:文件后綴名采用了黑名單的過濾方式,但少了一個php5
? ? ? ? ?2,修改content-type
一般是利用burp suite進行抓包,然后修改Content-Type為image/png,image/jpeg,image/gif
三,服務端的文件后綴名檢測:
一般的檢測手段:
黑名單過濾:黑名單的安全性比白名單低很多,服務器端,一般會有個專門的blacklist文件,里面會包含常見的危險腳本文件類型,常見黑名單:
| HTML | html、htm、sthml、shtm |
| PHP | php、php2、php3、php4、php5、phtml、pwml |
| ASP | asp、aspx、ascx、ashx、asa、cer、cdx |
| JSP | jsp、jspx、jspf |
| 其他 | xml、ini、htaccess、cgi、pl、js、exe、bat、swf |
白名單過濾:僅允許指定的文件類型上傳,比如僅允許上傳jpg | gif | doc | pdf等類型的文件,其他文件全部禁止。
一般的繞過方法:
黑名單: 1,大小寫繞過
也可以叫做 列表窮舉繞過,原理的是使用 黑名單中不存在并且能正常解析的有害的文件名,如Php,PHp5,等,有時還會忘記一個特別重要的文件后綴 htaccess(這個一會再說)
這里我們可以制作一個專門的文件后綴名的字典 suffixname.txt,然后用burp suite上的爆破模塊去爆破,這樣就可以快速的檢測出到底哪些 文件后綴被過濾了,哪些沒有:
2,特殊文件(.htaccess文件)的繞過
如果發現可以上傳.htaccess文件的情況,該文件僅在Apache平臺上存在,IIS平臺上不存在該文件,該文件默認開啟,啟用和關閉在httpd.conf文件中配置。該文件的寫法如下:
<FilesMatch "_php.gif">SetHandler application/x-httpd-php </FilesMatch>保存為.htaccess文件。該文件的意思是,只要遇到文件名中包含有”_php.gif”字符串的,統一按照php文件來執行。該文件在Apache里默認是啟用的,如果沒啟用,啟用方法見:http://www.jb51.net/article/25476.htm?然后就可以上傳一個帶一句話木馬的文件,例如a_php.gif,會被當成php執行。該方法其實不是漏洞,是Apache的特性。該方法常用于黑客入侵網站之后,不想被發現,留一個隱蔽的后門。
3,截斷(0x00)繞過
最常見的截斷繞或要數 00 截斷了,但是這種情況有很大的局限性,只有在 PHP 版本小于5.3.4 且 magic_quotes_gpc=Off時
Name = getname(http requests)//假如這一步獲取到的文件名是dama.asp .jpg Type = gettype(name)//而在該函數中,是從后往前掃描文件擴展名,所以判斷為jpg文件 If(type == jpg) SaveFileToPath(UploadPath.name , name)//但在這里卻是以0x00作為文件名截斷,最后以dama.asp存入路徑里(1)0x00截斷:基于一個組合邏輯漏洞造成的,通常存在于構造上傳文件路徑的時候
test.php(0x00).jpg
test.php%00.jpg
路徑/upload/1.php(0x00),文件名1.jpg,結合/upload/1.php(0x00)/1.jpg
Burp抓包,將文件名改為dama.php%00.jpg,選中%00,進行url-decode
或者將文件命名為123.php.jpg再在 burp suite 的proxy下 的hex中將 php后面的. 的2e改為 00
?
ascii 特殊字符包含
這里的例子是上海網安賽的 web4 ,參考了 sn00py 師傅的 wp
這道題先是前臺 sql 注入拿到 admin 的密碼之后,登錄后臺會發現有上傳點
這里的上傳有兩個重要的參數,一個是文件目錄(uploaddir),一個是文件名(filename)
上傳之后會對 uploaddir 和 filename 直接進行拼接,然后直接加上 .txt 后綴。沒辦法從正面直接繞過,00 截斷也是無效的,這里就嘗試用 0x00~0xff 之內的 ascii 字符來截斷。
burp 中發送數據包到 intruder 模塊,將范圍控制在 0~255 之間
用 intuder 模塊的 payload 進行處理,先加上 % ,再進行 urldecode
在 0x02 時可以截斷成功
4,利用系統特性繞過
在Windows系統中,上傳index.php.會重命名為index.php,可以繞過后綴檢查。 也可嘗試?index.php空格,index.php:1.jpg,?index.php::$DATA?等。
在Linux系統中,可以嘗試上傳名為?index.php/.?或?./aa/../index.php/.?的文件
5,Web Server解析漏洞繞過
一般最常用的web容器,IIS, Nginx, Apache
IIS解析漏洞:
版本:IIS5.X? /? IIS 6.0:
1,目錄名中含有.asp字符串的(目錄下)均按照asp文件進行解析;例如:index.asp/目錄中的所有文件都會asp解析
當出現xx.asp命名的文件名,訪問目錄下任意一個文件,均會送給asp.dll解析(執行asp腳本)2,文件名中含有.asp;字符,即使時jpg格式文件,IIS也會按照asp對文件進行解析
當文件名xx.asp;xx.jpg,IIS6會將文件送給asp.dll解析(按照asp腳本解析);請求時:IIS從左往右檢查.號,查詢到;或/號則(內存)截斷;如此執行后,IIS認識的就是xx.asp3,默認解析:.asp??.asa .cer .cdx?IIS6 同時默認解析前面三個文件后綴,都會給asp.dll解析
版本 IIS 7.0 /7.5
1,默認開啟?Fast-CGI?狀態,在一個服務器文件URL地址后面添加xx.php會將xx.jpg/xx.php解析為PHP文件
?
Nginx解析漏洞:
Nginx <= 0.8.37??影響版本:0.5/0.6/<0.7.65/<0.8.37
1,Fast-CGI開啟狀態下,存在如同IIS7一樣的漏洞:URL地址后面添加xx.php會將xx.jpg/xx.php解析為PHP文件
http://ultramangaia.cn/gg.jpg,在這個網址后面加上1.php, 即http://ultramangaia.cn/gg.jpg/1.php,會被解析成PHP腳本2,空字節:http://ultramangaia.cn/gg.jpg,在這個網址后面加上%00.php,即http://ultramangaia.cn/gg.jpg%00.php會導致解析為PHP腳本
?
Apache解析漏洞:
1,Apache解析文件的規則時從右到左開始判斷,如果后綴名為不可識別文件解析,則會繼續向左判斷,直至可以正確識別
? ? ?
白名單:1,截斷(0x00)繞過
跟黑名單的截斷繞過一樣,詳情參考黑名單的截斷繞過
? ? ? ? ? ? ? ?2,Web Server解析漏洞繞過
跟黑名單的解析漏洞一樣
四,服務端的目錄路徑檢測:
一般是檢測上傳的目錄路徑是否合法。
一般的繞過方法:(條件:目錄路徑可控)
1,若路徑可控,則可以使用0x00或%00截斷來繞過。
這里的%00截斷是用于GET方式中的,主要在目錄路徑上做手腳
2,利用web容器(Apache,Ngnix,IIS)的解析漏洞
解析漏洞的詳情參考上文黑名單的繞過,區別是黑名單繞過時主要在filename上做手腳,而這里主要是在目錄路徑上做手腳
?
五,服務端的文件內容的檢測:
如果文件內容檢測設置的比較嚴格,那么上傳攻擊將變得非常困難。以最常見的圖片類型內容檢測舉例。
一般的檢測手段:(以圖片上傳為例)
文件幻數檢測(文件頭)
文件相關信息檢測
文件加載檢測(渲染加載)
一般的繞過方法:(以圖片上傳為例)
1,文件幻數檢測繞過:
即文件頭檢測,主要是檢測文件內容開始處的文件幻數,比如圖片類型的文件幻數如下:
JPG文件:FF D8 FF E0 00 10 4A 46 49 46
GIF文件: 47 49 46 38 39 61
PNG文件:89 50 4E 47
只需要用winhex打開一句話木馬文件然后在16進制內容中將上面的圖片頭放在文件開始的位置就ok了
或者 找一個圖片 在文件頭后面插入一句話木馬就行了
?
特殊情況是按照黑名單檢測,比如檢測php的頭,<?php? ?
這時候我們可以用?<script language="php">繞過(自PHP 7.0.0起,被移除)
<script language="php"> @eval($_POST["pass"]); </script>制作圖片馬:http://gv7.me/articles/2017/picture-trojan-horse-making-method/
2,文件相關信息檢測繞過:
圖像文件相關信息檢測常用的就是getimagesize()函數和exif_imagetype()函數等。
getimagesize()函數的返回結果類型是個數字,其中索引2表示的是圖像的類型,返回的是數字,
其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF,8 = TIFF,9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM。
exif_imagetype():讀取一個圖像的第一個字節并檢查其簽名。
基本的繞過原理就是,先把文件頭部分偽造好,再在幻數加上了一些文件信息,比如GIF文件中添加的信息:
GIF89a (...some binary data for image...) <?php phpinfo(); ?> (... skipping the rest of binary data ...)用圖片馬的方法可以通殺,但是是需要能夠正常顯示的圖片馬。
?
深入了解 getimagesize()和imagemagick()函數:
https://www.leavesongs.com/PENETRATION/when-imagemagick-meet-getimagesize.html
3,文件加載檢測(圖像渲染,二次渲染)繞過:
這個是最變態的檢測,一般是調用API或函數去進行文件加載檢測。常見的是圖像渲染和二次渲染。
二次渲染的原理是調用imagecreatefromjpeg()函數對圖像進行二次編譯即進行了二次渲染。
imagecreatefromjpeg():由文件或URL創建一個新圖象。
?
渲染繞過:先用 GIMP 對一張圖片進行代碼注入
用 winhex 看數據可以分析出這類工具的原理是 在不破壞文件本身的渲染情況下找一個空白區進行填充代碼 一般是圖片的注釋區
對于渲染測試基本上都能繞過
但如果碰到變態的二次渲染 基本上就沒法繞過了,估計就只能對文件加載器進行攻擊了
?
二次渲染:是關于upload-labs pass16 的詳細分析??https://xz.aliyun.com/t/2657
六,WAF檢測:
一般的檢測手段較為復雜
一般的繞過手段也是千奇百怪,
大小上限:有些主機WAF軟件為了不影響web服務器的性能,會對校驗的用戶數據設置大小上限,比如1M。此種情況可以構造一個大文件,前面1M的內容為垃圾內容,后面才是真正的木馬內容,便可以繞過WAF對文件內容的校驗;
當然也可以將垃圾數據放在數據包最開頭,這樣便可以繞過對文件名的校驗。
可以將垃圾數據加上Content-Disposition參數后面,參數內容過長,可能會導致waf檢測出錯。
filename:針對早期版本的安全狗,可以多加一個filename來繞過,
3 POST/GET
有些WAF的規則是:如果數據包為POST類型,則校驗數據包內容。
此種情況可以上傳一個POST型的數據包,抓包將POST改為GET。
?
1,條件競爭
條件競爭是指一個系統的運行結果依賴于不受控制的事件的先后順序。 當這些不受控制的事件并沒有按照開發者想要的方式運行時,就可能會出現 bug。 尤其在當前我們的系統中大量對資源進行共享,如果處理不當的話,就會產生條件競爭漏洞。如果文件檢測是先保存后檢測,文件不合法再刪除的方式進行的,典型的“引狼入室”。
就可以利用條件競爭的方式在木馬文件在被刪除之前訪問它,使他成功的執行
具體的操作過程就是,利用工具,一邊不斷地快速上傳木馬文件,一邊不斷的請求訪問上傳的木馬文件,使一些來不及被刪除的木馬文件被成功執行
具體例子:
upload-labs pass17 條件競爭:
$is_upload = false; $msg = null;if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_name = $_FILES['upload_file']['name'];$temp_file = $_FILES['upload_file']['tmp_name'];$file_ext = substr($file_name,strrpos($file_name,".")+1);$upload_file = UPLOAD_PATH . '/' . $file_name;if(move_uploaded_file($temp_file, $upload_file)){if(in_array($file_ext,$ext_arr)){$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;rename($upload_file, $img_path);$is_upload = true;}else{$msg = "只允許上傳.jpg|.png|.gif類型文件!";unlink($upload_file);}}else{$msg = '上傳出錯!';} }可以看到文件先經過保存,然后判斷后綴名是否在白名單中,如果不在則刪除,此時可以利用條件競爭在保存文件后刪除文件前來執行php文件。
先利用burp suite抓一個文件上傳的包,右鍵? Send to Intruder 》添加爆破點 》添加payload,先暫時不開始爆破
我是在一句話后面加了個 爆破點,不影響一句話的執行,至于payload我隨便找了個相對較長的字典10000.txt
然后再在瀏覽器上訪問 127.0.0.1/upload-labs/upload/1.php,利用 burpsuite抓包,右鍵 Send to Intruder 》添加爆破點 》添加payload字典, 字典還用 10000.txt
?
然后兩個爆破 同時點擊 Start Attack ,一個上傳,一個訪問,然后你就會發現有成功訪問的包
成功訪問到了還沒來得及刪除的非法文件
?
?
?
參考文章:https://thief.one/2016/09/22/%E4%B8%8A%E4%BC%A0%E6%9C%A8%E9%A9%AC%E5%A7%BF%E5%8A%BF%E6%B1%87%E6%80%BB-%E6%AC%A2%E8%BF%8E%E8%A1%A5%E5%85%85/
https://www.mi1k7ea.com/2019/10/14/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%BC%8F%E6%B4%9E%E6%80%BB%E7%BB%93/
https://www.secpulse.com/archives/95987.html
https://xz.aliyun.com/t/2657
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的upload总结及一般处理思路步骤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FTP服务后门利用
- 下一篇: Java基础知识——异常Throwabl