滲透之路基礎 — 文件上傳

  • 2019 年 10 月 3 日
  • 筆記

具體還是要根據實戰情況來判斷分析,本文僅供思路學習和參考

漏洞危害

可以直接上傳Shell,導致伺服器getshell

漏洞形成

Web應用程式沒有對上傳文件的格式進行嚴格過濾 , 還有一部分是攻擊者通過 Web伺服器的解析漏洞來突破Web應用程式的防護;通常都會出現在,上傳功能上

文件上傳格式及解析

​ 沒有解析漏洞的情況下,格式程式碼必須要和文件格式一直,否則無法正常解析運行,如果存在解析漏洞的情況下,格式程式碼可以和不同格式相互解析

​ 之後也會發出關於解析漏洞的文章!

漏洞防禦

可以針對文件名文件大小文件內容文件類型等進行防禦

  1. 檢查文件上傳路徑 ( 避免 0x00 截斷、 IIS6.0 文件夾解析漏洞、目錄遍歷 )

  2. 文件擴展名檢測 ( 避免伺服器以非圖片的文件格式解析文件 )

  3. 文件 MIME驗證 ( 比如 GIF 圖片 MIME為 image/gif,CSS 文件的 MIME為 text/css 等 ) 3. 文件內容檢測 ( 避免圖片中插入 webshell)

  4. 圖片二次渲染 ( 最變態的上傳漏洞防禦方式 , 基本上完全避免了文件上傳漏洞 )

  5. 文件重命名 ( 如隨機字元串或時間戳等方式 , 防止攻擊者得到 webshell 的路徑 )

注意:若攻擊者上傳了shell之後,肯定會通過某刀劍進行連接,所以盡量不要暴露文件路徑,並且設置訪問許可權,以進一步防禦

文件上傳驗證及突破

文件過濾,驗證後綴:

  1. 文件頭驗證

  2. 文件類型驗證

  3. 文件後綴驗證

    繞過:

    1. 修改文件頭,偽造文件屬性
    2. 修改文件類型,偽造文件類型 MIME繞過
    3. 增加多重後綴,偽造文件後綴 命名繞過

    js 本地驗證突破

    1. 複製js程式碼,創建本地文件刪除相應驗證程式碼後直接上傳(無防盜鏈可用)

    2. %00 截斷 shell.php%00.jpg => shell.php

      測試程式碼 upload.php

      <?php  //文件上傳漏洞演示腳本之js驗證  $uploaddir = 'uploads/';  if (isset($_POST['submit'])) {      if (file_exists($uploaddir)) {          if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . $_FILES['upfile']['name'])) {              echo '文件上傳成功,保存於:' . $uploaddir . $_FILES['upfile']['name'] . "n";          }      } else {          exit($uploaddir . '文件夾不存在,請手工創建!');      }      //print_r($_FILES);  }  ?>  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">  <head>      <meta http-equiv="Content-Type" content="text/html;charset=gbk"/>      <meta http-equiv="content-language" content="zh-CN"/>      <title>文件上傳漏洞演示腳本--JS驗證實例</title>      <script type="text/javascript">          function checkFile() {              var file = document.getElementsByName('upfile')[0].value;              if (file == null || file == "") {                  alert("你還沒有選擇任何文件,不能上傳!");                  return false;              }              //定義允許上傳的文件類型              var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|";              //提取上傳文件的類型              var ext_name = file.substring(file.lastIndexOf("."));              //alert(ext_name);              //alert(ext_name + "|");              //判斷上傳文件類型是否允許上傳              if (allow_ext.indexOf(ext_name + "|") == -1) {                  var errMsg = "該文件不允許上傳,請上傳" + allow_ext + "類型的文件,當前文件類型為:" + ext_name;                  alert(errMsg);                  return false;              }          }      </script>  <body>  <h3>文件上傳漏洞演示腳本--JS驗證實例</h3>    <form action="" method="post" enctype="multipart/form-data" name="upload" onsubmit="return checkFile()">      <input type="hidden" name="MAX_FILE_SIZE" value="204800"/>      請選擇要上傳的文件:<input type="file" name="upfile"/>      <input type="submit" name="submit" value="上傳"/>  </form>  </body>  </html>

  上傳成功之後仍然是圖片格式

  *這時候需要抓包修改*

  - 注意:直接通過burp抓包修改,可能上傳的文件還是shell.php%00.jpg    - 需要通過修改%00的URL編碼格式:      - 選中%00 右鍵選中 URL      - 點擊 URL-decode      - %00 亂碼則可以上傳

文件上傳MIME驗證突破

​ 測試頁面 mime.php

<?php  //文件上傳漏洞演示腳本之MIME驗證  $uploaddir = 'uploads/';  if (isset($_POST['submit'])) {      if (file_exists($uploaddir)) {          if (($_FILES['upfile']['type'] == 'image/gif') || ($_FILES['upfile']['type'] == 'image/jpeg') ||              ($_FILES['upfile']['type'] == 'image/png') || ($_FILES['upfile']['type'] == 'image/bmp')          ) {              if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . $_FILES['upfile']['name'])) {                  echo '文件上傳成功,保存於:' . $uploaddir . $_FILES['upfile']['name'] . "n";              }          } else {              echo '文件類型不正確,請重新上傳!' . "n";          }      } else {          exit($uploaddir . '文件夾不存在,請手工創建!');      }      //print_r($_FILES);  }  ?>  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">  <head>      <meta http-equiv="Content-Type" content="text/html;charset=gbk"/>      <meta http-equiv="content-language" content="zh-CN"/>      <title>文件上傳漏洞演示腳本--MIME驗證實例</title>  <body>  <h3>文件上傳漏洞演示腳本--MIME驗證實例</h3>    <form action="" method="post" enctype="multipart/form-data" name="upload">      請選擇要上傳的文件:<input type="file" name="upfile"/>      <input type="submit" name="submit" value="上傳"/>  </form>  </body>  </html>

抓包修改 Content-Type

序號 內容類型 文件擴展名 描述
1 application/msword doc Microsoft Word
2 application/octet-stream bin dms lha lzh exe class 可執行程式
3 application/pdf pdf Adobe Acrobat
4 application/postscript ai eps ps PostScript
5 appication/powerpoint ppt Microsoft Powerpoint
6 appication/rtf rtf rtf 格式
7 appication/x-compress z unix 壓縮文件
8 application/x-gzip gz gzip
9 application/x-gtar gtar tar 文檔 (gnu 格式 )
10 application/x-shockwave-flash swf MacroMedia Flash
11 application/x-tar tar tar(4.3BSD)
12 application/zip zip winzip
13 audio/basic au snd sun/next 聲音文件
14 audio/mpeg mpeg mp2 Mpeg 聲音文件
15 audio/x-aiff mid midi rmf Midi 格式
16 audio/x-pn-realaudio ram ra Real Audio 聲音
17 audio/x-pn-realaudio-plugin rpm Real Audio 插件
18 audio/x-wav wav Microsoft Windows 聲音
19 image/cgm cgm 電腦圖形元文件
20 image/gif gif COMPUSERVE GIF 影像
21 image/jpeg jpeg jpg jpe JPEG 影像
22 image/png png PNG 影像

http://www.w3school.com.cn/media/media_mimeref.asp

關於編輯器上傳漏洞利用

​ 網站程式編輯器插件,eweb,fck,ce,cfinder,ck等

​ 利用圖片路徑判斷編輯器類型

.htaccess 文件上傳漏洞

​ 只適用於Apache 通過配置文件來解析執行相應腳本

<FilesMatch "code">  SetHandler application/x-httpd-php  </FilesMatch>

直接訪問是訪問不到的

通過修改.htaccess文件可直接訪問

可以將任意文件解析為PHP

  1. 如果存在上次.htaccess文件,可以直接利用規則解析
  2. 如果存在修改文件的許可權,修改解析規則
  3. 拓展利用:許可權維持