作者:Lucifaer
博客:https://www.lucifaer.com/

0x01 漏洞概述

Confluence Server and Data Center had a path traversal vulnerability in the downloadallattachments resource. A remote attacker who has permission to add attachments to pages and / or blogs, or to create a new space or personal space, or who has 'Admin' permissions for a space, can exploit this path traversal vulnerability to write files to arbitrary locations which can lead to remote code execution on systems that run a vulnerable version of Confluence Server or Data Center.

根據官方文檔的描述,我們大致能知道這是個需要權限的路徑穿越的漏洞,并且可以將文件上傳到任意路徑。造成這個漏洞的關鍵點在于DownloadAllAttachments這個資源。在經過diff后,可以確定漏洞觸發的關鍵點在于文件名的構造:

修復前

修復后

可以看到這里是對這里的attachment.getFileName所獲取的文件名進行二次文件名獲取。

0x02 漏洞分析

分析這個漏洞要從兩個點入手:

  • DownloadAllAttachments自身的處理流程
  • 如何讓文件名中包含../

在分析前我們應清楚哪里能調用DownloadAllAttachments,這樣才方便調試。根據官方給出的臨時修補措施,我們大致可以從附件管理的Download all attachments這個地方入手:

-w635

-w1133

2.1 DownloadAllAttachments處理流程

DownloadAllAttachments位于com.atlassian.confluence.pages.actions.DownloadAllAttachmentsOnPageAction,為了便于快速的解釋這個漏洞,我用動態調試+靜態分析的方法來進行說明。

我這里選取的是默認生成的Lay out your page (step 6 of 9)這個頁面的下載全部附件進行測試的:

-w1132

代碼非常簡單,分兩部分來看:

可以看到在這里首先會將附件中的所有文件的基礎信息置于一個數組中,然后對數組進行遍歷,然后執行以下操作:

  1. 根據文件名創建一個新的File對象(tmpFile)
  2. 將文件內容寫入輸入流
  3. FileOutputStream輸出流指向File對象
  4. 將輸入流中的內容拷貝到FileOutputStream輸出流中

這樣就完成了將文件拷貝到另外一個位置的操作。

這里的attachment.getFileName()

而title名就是文件名:

getTempDirectoryForZipping()

是根據時間和隨機數生成的一個目錄,格式類似于download2q1gP165938,這里我們通過方法的名字就能看出這里是建立了一個創建一個zip的目錄,這個目錄在confluence_home/temp/

ok,知道了這些,繼續向下看DownloadAllAttachments

這里是完成將zip目錄打包成zip文件的過程。

在進行文件復制的時候,我們注意到文件的路徑是zip目錄與文件名直接進行進行拼接生成的:

而這里就是整個目錄穿越的關鍵,也就是說在生成zip文件前,如果附件列表中有文件的文件名是../../xxx的格式的話,就能進行目錄穿越,在任意位置創建文件。

2.2 尋找利用鏈

默認情況下,我們是沒有辦法創建以.開頭的文件的,如果想要上傳一個文件名類似../../xxx的文件的話,最簡單的思路是用burp中間改包,但是在這個例子中是不行的:

-w1241

應該是進行了自動的過濾,這個方法行不通。我又注意到了在屬性中好像能修改文件名:

-w1132

但是也是不成功的:

-w700

就在我想要放棄的時候我嘗試了一下編輯頁面中的上傳附件功能,竟然成功了:

-w1036

-w1245

-w1122

在這里我點擊下載全部,即可完成目錄穿越:

-w559

我們來對比一下兩種上傳方式有什么不同。

直接上傳(FileStorer)

直接上傳這里是調用的com.atlassian.confluence.pages.actions.beans.FileStorer,關鍵點在:

在獲取文件名時會對請求中的文件名進行處理:

會將文件名提取出來。

利用插件上傳

在利用插件上傳時用的是drag-and-drop這個插件在com.atlasian.confluence.plugins.dragdrop.UploadAction

在處理請求時并未對請求中的文件名進行處理:

所以會保存我們惡意修改的文件名

至此該漏洞分析完畢。

0x03 構造POC

首先登陸后編輯附件數大于2個的頁面,在頁面中加入附件:

-w1036

burp抓包修改上傳文件的文件名:

-w1245

在附件管理頁面下載全部附件:

-w1122

文件會生成到/confluence_home/temp/zip文件名../../目錄中:

-w646

0x04 Reference


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/896/