淺析檔案上傳漏洞

L_lemo004發表於2020-10-20

檔案上傳

成因

  • 對於上傳檔案的字尾名(副檔名)沒有做較為嚴格的限制
  • 對於上傳檔案的MIMETYPE 沒有做檢查
  • 許可權上沒有控制對於上傳的檔案的檔案許可權,(尤其是對於shebang型別的檔案)
  • 對於web server對於上傳檔案或者指定目錄的行為沒有做限制

客戶端校驗

  • 前段js驗證

    • 可通過審計修改js程式碼或burp改包繞過

伺服器校驗

  • content-type欄位校驗

    • 將Content-Type修改為image/gif,或者其他允許的型別
    • 刪除整行
    • 刪除掉ontent-Type: image/jpeg只留下c,將.php加c後面即可,但是要注意,雙引號要跟著c.php
    • 將Content-Type修改為content-Type
    • 將 Content-Type: application/octet-stream 冒號後面 增加一個空格
  • 檔案頭校驗

    • 將檔案頭修改為可允許上傳檔案型別的檔案頭
  • 檢查副檔名

    • 黑名單策略

      • 列表名繞過

        • 查詢黑名單中的漏網之魚,比如asa,cer,cer,ashx,asa,cer,cdx,htr,
      • 大小寫繞過

        • 比如aSp,pHp等
      • 能被解析的字尾名:jsp,jspx,jspf,asp,asa,cer,aspx,ashx,php,php ,php3,php4,exe,exee

      • 上傳.htaccess檔案

        • 通過.htaccess 檔案呼叫 php 的解析器去解析一個檔名只要包含”cimer”這個字串的任意檔案。一個自定義的.htaccess 檔案可以以各種各樣的去繞過很多上傳驗證機制。(配合黑名單檢測)

          • 1.建立.htaccess 檔案,內容如下:<FilesMatch “cimer”>
            SetHandler application/x-httpd-php

          • 上傳 php 木馬檔名包含 cimer

            • 將一句話密碼設定為cimer
        • 利用 php 解析器來解析 jpg 檔案建立.htaccess 檔案內容如下:AddType application/x-httpd-php .jpg

      • 空格繞過

        • 在字尾名後新增空格
      • 檔名繞過

        • php1,php2,php3,php4,php5,Php,aSp
      • 特殊字元繞過

        • 1.asp_
    • 白名單策略

      • 通過解析漏洞上傳
    • 0x00截斷繞過

      假設檔案的上傳路徑為【http://xx.xx.xx.xx/upfiles/lubr.php.jpg】,通過抓包截斷將【lubr.php】後面的【.】換成【0x00】。在上傳的時候,當檔案系統讀到【0x00】時,會認為檔案已經結束,從而將【lubr.php.jpg】的內容寫入到【lubr.php】中,從而達到攻擊的目的。
      上傳抓包後(假如上傳的jpg檔名字為1.jpg)在hex中找到1.jpg對應的十六進位制,將“.”對應的十六進位制(.的十六進位制是2e)改為00,go,在上刀連線就行了

      • 00截斷就是利用程式設計師在寫程式時對檔案的上傳路徑過濾不嚴格,產生0x00上傳截斷漏洞。PS:0x00是字串的結束識別符號

      • 例:1.php%00.jpg

      • 限制條件

        • PHP<5.3.29,且GPC關閉
      • 原理

        • 0x00是字串的結束識別符號,系統在對檔名的讀取時,如果遇到0x00,就會認為讀取已結束。
        • 注:00指的是檔案的16進位制內容裡的00,而不是檔名中的00 !!!就是說系統是按16進位制讀取檔案(或者說二進位制),遇到ascii碼為零的位置就停止,而這個ascii碼為零的位置在16進位制中是00,用0x開頭表示16進位制,也就是所說的0x00截斷。
    • 雙副檔名繞過

      • apache的conf配置有AddHandler php5-script.php沒有註釋掉,檔名1.php.jpg就能當作php執行
  • 檔案型別驗證

    • 通過抓包將content-type欄位改為允許上傳的型別

原理

檔案上傳漏洞是指網路攻擊者上傳了一個可執行的檔案到伺服器,伺服器未經任何檢驗或過濾,從而造成檔案的執行。這裡上傳的檔案可以是木馬,病毒,惡意指令碼或者WebShell等。

危害

  • 上傳檔案是Web指令碼語言,伺服器的Web容器解釋並執行了使用者上傳的指令碼,導致程式碼執行。
  • 上傳檔案是Flash的策略檔案crossdomain.xml,黑客用以控制Flash在該域下的行為(其他通過類似方式控制策略檔案的情況類似);
  • 上傳檔案是病毒、木馬檔案,黑客用以誘騙使用者或者管理員下載執行。
  • 上傳檔案是釣魚圖片或為包含了指令碼的圖片,在某些版本的瀏覽器中會被作為指令碼執行,被用於釣魚和欺詐。

防禦

  • 副檔名服務端使用白名單策略校驗。
  • 檔案內容服務端校驗
  • 上傳檔案隨機重新命名
  • 隱藏上傳檔案路徑
  • 檔案上傳的目錄設定為不可執行
  • 單獨設定檔案伺服器的域名

解析漏洞

IIS 6.0 在處理含有特殊符號的檔案路徑時會出現邏輯錯誤,從而造成檔案解析漏洞。

  • IIS解析漏洞

    • IIS6.0

      • 目錄解析:/xx.asp/xx.jpg ,如果一個目錄以"xxx.asp"的形式命名,那麼該目錄下的所有型別檔案都會被當做asp檔案來進行解析執行

      • 檔案解析:test.asp;.jpg ,在IIS6.0下,分號後面的不被解析,也就是說test.asp;.jpg會被伺服器看成是test.asp

      • 還有IIS6.0 預設的可執行檔案除了asp還包含這三種.asa、.cer、.cdx

      • PUT漏洞

        • 成因:IIS Server 在 Web 服務擴充套件中開啟了 WebDAV ,配置了可以寫入的許可權,造成任意檔案上傳。

        • 修復

          • 關閉 WebDAV 和寫許可權
      • 短檔名猜解 PS:IIS6.0~10.0都受影響

        • 成因:IIS 的短檔名機制,可以暴力猜解短檔名,訪問構造的某個存在的短檔名,會返回404,訪問構造的某個不存在的短檔名,返回400。

        • 修復

          • 升級 .net framework

          • 修改登錄檔禁用短檔名功能

            • 快捷鍵 Win+R 開啟命令視窗,輸入 regedit 開啟登錄檔視窗,找到路徑:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,將其中的 NtfsDisable8dot3NameCreation這一項的值設為 1,“1”代表不建立短檔名格式,修改完成後,需要重啟系統生效

			- CMD 關閉 NTFS 8.3 檔案格式的支援
			- 將 web 資料夾的內容拷貝到另一個位置,如 c:\www 到 d:\w ,然後刪除原資料夾,再重新命名 d:\w 到 c:\www。
			- 修復成功後顯示:Server is not vulnerable

		- 侷限性

			- 此漏洞只能確定前6個字元,如果後面的字元太長、包含特殊字元,很難猜解
			-  如果檔名本身太短(無短檔名)也是無法猜解的
			- 如果檔名前6位帶空格,8.3格式的短檔名會補進,和真實檔名不匹配

	- 遠端程式碼執行

		- 成因:在 IIS6.0 處理 PROPFIND 指令的時候,由於對 url 的長度沒有進行有效的長度控制和檢查,導致執行 memcpy 對虛擬路徑進行構造的時候,引發棧溢位,從而導致遠端程式碼執行。
		- 修復

			- 關閉WebDAV服務
			- 使用相關防護裝置

- IIS7.0/7.5

	- test.jpg/.php  

	  URL 中檔案字尾是 .php ,便無論該檔案是否存在,都直接交給 php 處理,而 php 又預設開啟 “cgi.fix_pathinfo” ,會對檔案進行“修理”,可謂“修理”?舉個例子,當 php 遇到路徑 “/aaa.xxx/bbb.yyy” 時,若 “/aaa.xxx/bbb.yyy” 不存在,則會去掉最後的 “bbb.yyy” ,然後判斷 “/aaa.xxx” 是否存在,若存在,則把 “/aaa.xxx” 當作檔案。
	  
	  若有檔案 test.jpg ,訪問時在其後加 /.php ,便可以把 “test.jpg/.php” 交給 php ,php 修理檔案路徑 “test.jpg/.php” 得到 ”test.jpg” ,該檔案存在,便把該檔案作為 php 程式執行了。

修復

  • 對新建目錄檔名進行過濾,不允許新建包含‘.’的檔案
  • 取消網站後臺新建目錄的功能,不允許新建目錄;
  • 限制上傳的指令碼執行許可權,不允許執行指令碼;
  • 過濾 .asp/xm.jpg,通過 ISApi 元件過濾。

相關文章