1. 程式人生 > 其它 >伺服器端MIME型別檢測繞過

伺服器端MIME型別檢測繞過

一、MIME型別

1、MIME的全名叫多用途網際網路郵件擴充套件(Multipurpose Internet Mail Extensions),最初是為了將純文字格式的電子郵件擴充套件到可以支援多種資訊格式而定製的。後來被應用到多種協議裡,包括我們常用的HTTP協議。 2、 在訪問網頁時,MIME type幫助瀏覽器識別一個HTTP請求返回的是什麼內容的資料,應該如何開啟、如何顯示。 3、 MIME的常見形式是一個主型別加一個子型別,用斜線分隔。比如text/html、application/javascript、image/png等。

二、檔案上傳中的MIME校驗

1、Web應用通過MIME型別區分資料的不同種類,通過MIME型別來說明允許傳送或接收的資料種類,檔案上傳中的MIME校驗屬於白名單的一種,通過MIME型別判斷上傳的檔案是否合法
2、 常用的檔案上傳型別的 MIME 表: text/plain(純文字)、text/html(HTML 文件)、text/javascript(js 程式碼)、application/xhtml+xml、XHTML 文件)、image/gif(GIF 影象、 image/jpeg(JPEG 影象)、image/png(PNG 影象)、video/mpeg(MPEG 勱畫)、application/octet-stream(二迚制資料)、application/pdf(PDF 文件)、application/(程式語言) 該種語言的程式碼、application/msword(Microsoft Word 檔案)、message/rfc822(RFC 822 形式)、multipart/alternative(HTML 郵件的 HTML 形式和純文字形式,相同內容使用不同形式表示)、application/x-www-form-urlencoded(POST 方法提交的表單、multipart/form-data(POST 提交時伴隨檔案上傳的表單)

三、MIME校驗繞過方法

1、修改資料包中的Content-Type欄位的值為允許的型別,如修改Content-Type:application/octet-stream為Content-Type:image/gif

四、示例——upload-labs Pass-02

1、檢視提示,本pass在服務端對資料包的MIME進行檢查 2、檢視原始碼
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file 
= $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'] if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true; } else { $msg = '上傳出錯!'; } } else { $msg = '檔案型別不正確,請重新上傳!'; } } else { $msg = UPLOAD_PATH.'資料夾不存在,請手工建立!'; } }
發現程式碼中對檔案Type進行檢查,只允許上傳image/jpeg、image/png和image/gif三種格式,且為伺服器端校驗 3、上傳一個php的shell檔案,使用BurpSuite抓包,發現Content-Type欄位的值為application/x-php 4、修改Content-Type欄位值為image/png,釋放資料包,然後嘗試用蟻劍連線,連線成功