文件上傳漏洞——文件上傳檢測彙總

文件上傳檢測分類

  • 任意上傳
  • 前端JS檢測
  • 文件擴展名檢測
  • MIME-type檢測
  • 文件頭檢測
  • 文件加載檢測

1、任意上傳概念:

  • 服務端腳本語言未對上傳的文件進行任何限制和過濾,導致惡意用戶上傳任意文件。

2、前端JS檢測。

  • js驗證-源代碼
  •     function checkFileExt()
  • {
  •  var filename = document.getElementById("file0").value;
  •  var flag=false;  //設置標誌位
  •  var arr = ["jpg","png","gif"];
  •  var index = filename.lastIndexOf(".");   //取出上傳文件的擴展名
  •  var ext = filename.substr(index+1);
  •  for(var i=0;i<arr.length;i++)   //循環比較
  •  { if(ext == arr[i])  {flag = true;
  •   //一旦找到合適的,立即退出循環
  •    break;} }
  •  if(flag) {
  •   alert("文件名合法");
  •  }else{
  •   alert("文件名不合法"); }
  •  return flag;
  • };
  • 繞過js校驗上傳
  • Web應用系統雖然對用戶上傳的文件進行了校驗,但是校驗是通過前端javascript代碼完成的。由於惡意用戶可以對前端javascript進行修改或者是通過抓包軟件篡改上傳的文件,就會導致基於js的校驗很容易被繞過。
  • 繞過方法
  • 1、刪除或者禁用js。
  • 2、使用代理上傳文件,比如Burp Suite。

3、文件上傳漏洞-後端上傳代碼校驗繞過。

  • 常規檢測方法
  • MIME文件類型校驗
  • 擴展名驗證
  • 文件頭校驗

4、文件擴展名檢測。

  • 截斷上傳
  • 基於一個組合邏輯漏洞造成的。在某些時候,攻擊者手動修改了上傳過程中的POST包,在文件名後添加一個%00字節額,則可以截斷某些函數對文件名的判斷。因爲在許多語言的函數中,比如在C、PHP等語言的常用字符串處理函數中,0x00被認爲是終止符。受此影響的環境有Web應用和一些服務器。比如應用原本只允許上傳JPG圖片,那麼可以構造文件名爲xxx.php[\0].JPG,其中[\0]爲十六進制的0x00字符,.JPG繞過了應用的上傳文件類型判斷;但對於服務器來說,此文件因爲0x00字符截斷的關係,最終卻變成了xxx.php。
  • 檢測方法
  • 1、黑名單
  • 黑名單檢測:一般有個專門的 blacklist 文件,裏面會包含常見的危險腳本文件。
  • 2、白名單
  • 白名單檢測:一般有個專門的 whitelist 文件,裏面會包含的正常文件。
  • 繞過黑名單
  • 繞過方法:
  • 1、解析漏洞
  • 2、截斷上傳
  • 3、可能存在大小寫繞過漏洞 - 比如 aSp 和 pHp 之類
  • 4、找黑名單擴展名的漏網之魚 - 比如 asa 和 cer 之類
  •       jsp jspx jspf     asp asa cer aspx     php php php3 php4 php5     exe exee
  • 5、利用Windows的命名機制:shell.php.  shell.php空格  shell.php:1.jpg shell.php:: $DATA
  • 繞過白名單
  • 解析漏洞
  • 截斷上傳
  • 文件包含

5、MIME-TYPE檢測。

  • 什麼是MIME
  • MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。
  • 常見的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文檔)
  • 檢測
  • if ((($_FILE["file"]["type"] == "image/gif") ||$_FILE["file"]["type"] == "image/jpeg") ||$_FILE["file"]["type"] == "image/pjpeg")
  • 繞過文件類型校驗
  • 部分Web應用系統判定文件類型是通過content-type字段,黑客可以通過抓包,將content-type字段改爲常見的圖片類型,如image/gif,從而繞過校驗。

6、文件頭檢測

  • 什麼是文件頭
  • 文件頭就是爲了描述一個文件的一些重要的屬性,比如圖片的長度、寬度、像素尺寸等,當程序打開文件時讀取這些屬性對文件進行處理。
  • getimagesize()函數
  • getimagesize() 函數用於獲取圖像大小及相關信息,成功返回一個數組,失敗則返回 FALSE 併產生一條錯誤信息。
  • 語法:
  • getimagesize( string filename ) 例子:
  • <?php $array = getimagesize("images/flower_1.jpg"); print_r($array); ?>
  • 瀏覽器顯示如下:
  • Array ( [0] => 350 [1] => 318 [2] => 2 [3] => width="350" height="318" [bits] => 8 [channels] => 3 [mime] => image/jpeg ) 返回結果說明
  • 索引 0 給出的是圖像寬度的像素值
  • 索引 1 給出的是圖像高度的像素值
  • 索引 2 給出的是圖像的類型,返回的是數字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
  • 索引 3 給出的是一個寬度和高度的字符串,可以直接用於 HTML 的 <image> 標籤
  • 索引 bits 給出的是圖像的每種顏色的位數,二進制格式
  • 索引 channels 給出的是圖像的通道值,RGB 圖像默認是 3
  • 索引 mime 給出的是圖像的 MIME 信息,此信息可以用來在 HTTP Content-type 頭信息中發送正確的信息,如:header("Content-type: image/jpeg");
  • memcmp函數
  • 原型爲:int memcmp(const void *str1, const void *str2, size_t n));
  • 其功能是把存儲區 str1 和存儲區 str2 的前 n 個字節進行比較。
  • 該函數是按字節比較的,位於string.h。
  • 繞過文件頭校驗
  • Web應用程序在校驗文件類型、文件擴展名的同時,也會校驗文件頭,從而進一步確定文件的類型。針對這種情況,可以通過在上傳的一句話木馬文件的開頭加入特定的文件頭從而繞過這種校驗方式。
  • 常用的三個圖片格式文件頭
  •     JPG
  • FF D8 FF E0 00 10 4A 46 49 46
  •     png
  • 89 50 4E 47 0D 0A 1A 0A
  •     gif
  • 47 49 46 38 39 61
  • 如何修改文件頭
  • 1.將文件的前面加通過16進制編輯器添加文件頭。如:GIF89a
  • 2.將一個正常的圖片文件添加到一個php文件前面,通過命令行copy。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章