檔案上傳(解析)漏洞詳解

weixin_49150931 發表於 2020-11-27

一、檔案上傳漏洞介紹


1、檔案上傳:現代網際網路的功能,允許使用者上傳圖片、視訊及其他型別檔案,向使用者提供的功能越多,Web受攻擊的風險就越大。

二、檔案上傳漏洞

  1. 上傳檔案時,如果未對上傳的檔案進行嚴格的驗證和過濾,就容易造成檔案上傳漏洞,上傳指令碼檔案(包括asp、aspx、php、jsp等)
    :asp aspx對應IIS解析、php對應apache解析jsp對應java
  2. 惡意上傳行為可能導致網站甚至整個伺服器被控制。惡意的指令碼檔案又被稱為WebShell、WebShell具有強大的功能,如檢視伺服器目錄、伺服器中檔案、執行系統命令等

三、檔案繞過

1.JS繞過

檢測原理
(1)、呼叫JS的toLowerCaaw()函式,先將檔名轉換為小寫,然後通過substr獲取檔名後面最後一個點號後面的字尾(包括點號)進行判斷。

(2)、substr() //返回字串
//enctype=“multipart/form-data” 專門處理檔案上傳的檔案流
//return selectFile() 提供點選提交按鈕,完成檔案上傳

1、第一種繞過方式
(1)程式碼
只能上傳.jpg格式的檔案
(2)、網站訪問前端程式碼,進行瀏覽器前端繞過檔案上傳

在這裡插入圖片描述
在這裡插入圖片描述
按FN+F12調出控制檯點選thml將onsubmit值修改為空。

詳:通過F12開啟開發者模組,將onsubmit的值刪除,這裡οnsubmit=""呼叫的函式即為我們編寫的判斷(過濾)方法。將此處值刪除後再次點選上傳我們想要上傳的任意檔案,觀察實驗。
上成功後,再URL中訪問上傳後的檔案。

第二種:使用抓包修改進行繞過
1、使用burpsuit抓包,這裡必須先上傳jpg格式的檔案
在這裡插入圖片描述
如果想上傳php等其他型別的檔案可以先修改檔案字尾或者使用檔案合成方法等抓包的時候修改回即可。

還有一種方式圖片與程式碼合成,然後上傳jpg字尾檔案然後進行抓包修改字尾為.PHP放包即可

圖片合成的方法:將需合成的檔案放到一個檔案目錄下然後進入該目錄輸入cmd然後輸入命令
copy 1.jpg + 2.php 3.jpg
檔案1 + 檔案2 合成檔案3
:這裡將33.jpg檔案字尾修改回.php後放包,檔案即可成功上傳。

2.檔案字尾名繞過

1.檢測原理
通過函式pathinfo()獲取檔案字尾,將字尾轉為小寫後判斷是不是php檔案。

注:pathinfo() //返回檔案路徑資訊

2.修改配置檔案繞過

  • 有些中介軟體允許解析其他檔案字尾的,如在httpd.conf配置檔案中,配置如下程式碼,則能解析php、php3、phtml檔案。所以上傳一個字尾名為php3、phphtml的檔案即可繞過黑名單。

這裡新增訊息含義是要能夠解析php3、phtml這裡是將新增的這兩種字尾按照php檔案解析
2、黑名單繞過
(1)前端程式碼
在這裡插入圖片描述
後端程式碼
在這裡插入圖片描述
(2)、網路訪問我的前端程式碼,進行檔案上傳
注:這裡我們嘗試上傳了html,txt等發現只有php無法上傳,通過程式碼我們也知道此處php檔案已經被加入黑名單,不允許字尾為php的檔案上傳
**注:**這裡我們嘗試上傳了html,txt等發現只有php無法上傳,通過程式碼我們也知道此處php檔案已經被加入黑名單,不允許字尾為php的檔案上傳。

3、畸形檔名上傳繞過(還是使用上面的原始碼進行實驗)
這裡我們上傳一個字尾名為php3的檔案,如下圖,我們發現上傳成功,但是訪
問該檔案時,php檔案未解析。
在這裡插入圖片描述
**注:**我們此模組的內容主要講檔案解析及上傳,這裡檔案上傳已經成功,接下來要做的就是檔案解析。
4、修改httpd.conf配置檔案

  • (1)、有些中介軟體允許解析其他檔案字尾的,如httpd.conf配置檔案中,配置程式碼如下圖,則能夠解析php、php3、phtml檔案。所以上傳一個字尾名為php3、phtml的檔案即可。
  • 開啟方式:phpstudy皮膚,點選【設定】->【配置檔案】->【httpd.conf】->點選apache的版本 開啟檔案:

在這裡插入圖片描述

  • (2)、在檔案處使用Ctrl+F進行查詢,先查詢AddType
    如圖:找到一下內容,在下面加入以下3條命令:
    在這裡插入圖片描述

  • AddType application/x-http-php .php

  • AddType application/x-http-php .php3

  • AddType application/x-http-php .phtml
    **注:**這裡新增訊息的含義是要能夠解析php3,phtml 這裡是將新增的這兩種字尾按照php檔案解析。

修改被指檔案後,重啟apache服務,重新訪問剛才上成功的.php3文字,發現php3檔案可以被正常解析

5、繞過方法(apache解析漏洞)
(1)、結合Apache檔案解析機制,從右向左開始解析檔案字尾,若字尾名不可識別,則繼續判斷直到遇到可解析的字尾為止,若全部不認識,則會暴露檔案內容。

6.繞過方法(windows特性:檔案流繞過)
(1)、在程式開發部署的時候,沒有考慮到系統的特性會導致限制被繞過,利用windows特性。可以在字尾名中加".“或”::$DATA"繞過。
過程略,繞過上傳成功後檔案根目錄注意觀察我們上傳的檔案的字尾。
在這裡插入圖片描述

抓包filename尾部新增::$DATA進行繞過
在這裡插入圖片描述

在瀏覽器中訪問發現.過濾掉了,可以正常解析。
在這裡插入圖片描述
:這裡我們給檔名直接加. windows本身特性會自動刪除,限制如此修改檔案字尾,這裡就需要使用burpsuit來進行修改。

2.檔案型別繞過

1、檢測原理

  • 判斷$_FILES[“file”][“type”]是不是圖片格式(image/gif、image/jpeg、image/pjpeg),不是則不允許上傳。

  • $_FILES[“file”][“type”]的值是從請求資料包中Content-type中獲取的。
    2、繞過方法一

  • 通過抓取資料請求包,上傳php檔案時,Content-Type值為application/octer-stream,上傳jpg的檔案時Content-Type值為image/jpeg。可修改檔案型別進行繞過。
    3、繞過方法二

  • 如果程式碼使用getimagesize()函式獲取圖片的寬高等資訊,如果上傳的不是圖片,那麼則獲取不到資訊。

  • 在圖片檔案指令碼檔案開頭補充圖片對應的頭部值,或在圖片後寫入指令碼程式碼(這裡就是第一種方式講過圖片+程式碼合成新圖片的知識模組)

**(1)**這裡我們將檔案頭部值寫入檔案即可
**注:**下圖顯示的47 49 46……這些是16進位制數,可以通過01編輯器進行編輯,我們通過nt++編輯時可直接在程式碼前面編寫GIF89a,我們可以通過編碼轉換進行驗證。在這裡插入圖片描述
**(2)**方法2 合成圖片這種方法前面已經講過,這裡不再講。下面再將一種方式.加粗樣式
直接將圖片使用記事本模式開啟,在亂碼後面直接加入我們需要加入的PHP程式碼。

**注:**這裡我們修改完後檔案字尾名依舊是.JPG 我們雖然修改了檔案內容,但是上傳成功後.JPG檔案依舊無法解析。這裡我們要將新增完程式碼的圖片字尾名改為.php後再次上傳,上傳後即可實現解析。但這裡操作沒有方法1方便,操作時也可將合成圖片上傳後,在burpsuit中將字尾名改為php後放包,即可實現上傳繞過,也可實現解析。

未結束…加粗樣式