IKEA官網本地檔案包含(LFI)漏洞分析
背景
通過本地檔案包含(Local File Inclusion)攻擊,攻擊者可以對伺服器進行欺騙,使其共享不公開的檔案,而不公開的檔案中可能會包含網站的配置、日誌和原始碼檔案。甚至有時該漏洞會導致遠端程式碼執行。因此,LFI攻擊被認為具有較高的威脅性。
大多數LFI攻擊都是由動態載入影象(或其他檔案)的程式碼引起的。如果請求的檔名或路徑未經正確驗證,那麼伺服器將會向攻擊者提供所請求的私有檔案。接下來,我們將對IKEA.com上發現的這一漏洞展開深入分析。
IKEA是位於福布斯TOP 50的一個知名品牌,他們不僅擁有優秀的家居產品,同時還運營著設計人性化的網站和應用程式。與此同時,IKEA開展了漏洞賞金活動,允許安全研究者對其網站和應用程式進行測試,並在遵守“負責任的漏洞披露原則”的前提下進行公開。
尋找目標
在針對一個域名進行測試時,我通常都首先遍歷目標的所有子域名。為了讓這一工作更為簡單,我使用Aquatone工具,這一工具會在不同的公共域名資料庫中進行搜尋,並返回一個質量較高的活動子域名列表,同時還包含這些域名的截圖。如果想要了解關於Aquatone的更多資訊,建議檢視Apple.com報告中的“Unrestricted File Upload”部分。
鎖定目標:浴室規劃師
我們找到的一個子域名是Bathroomplanner.IKEA.com,這是一個工具,可以讓客戶自行查詢產品,並將其新增到自己的浴室產品列表中。
客戶可以通過電子郵件的方式,將產品列表發到自己的郵箱,或者以PDF格式從本地下載。生成的PDF檔案中包含一些文字和產品圖片,可能看起來沒有什麼特別之處。
但是,我們有一個疑問,PDF是如何生成的?
攔截網路流量
要攔截網路流量,最好的工具就是Burp Suite了。於是,我們啟動Burp Suite,開始攔截瀏覽器和IKEA網路伺服器之間的流量。
我們開啟首頁,並試圖將產品新增到我們的列表之中。
接下來,能夠看到一些有趣的欄位:
Data:包含產品和影象程式碼的JSON Blob,沒有檔案路徑; Shopping:包含產品列表的JSON Blob,沒有檔案路徑; Pdf:一長串字元,內容不明; Images:一些Base64編碼後的影象。
識別Base64編碼字串
如果我們發現一長串由字母和數字組成的字元,那麼首先應該檢查它是否為Base64編碼的字串。Base64編碼通常用於檔案的資料傳輸。在這裡,有一個用於解碼Base64字元則線上工具,位於: ofollow,noindex" target="_blank">http://decodebase64.com/ 。
我們將該字串貼上到解碼器中,將會報錯,原因在於字串中包含%之類的無效字元。看到%符號,我們應該立刻聯想到URL編碼,因此我們在進行Base64解碼之前,首先嚐試進行URL解碼。有一個URL解碼的工具,位於: https://meyerweb.com/eric/tools/dencoder/ 。
我們進行URL解碼和Base64解碼後,得到以下字串:
這看上去很有趣。如果我們將產品新增到列表中,還會從IKEA的Web伺服器中,提供一些用於生成PDF購物清單的模板。
如果我們能夠將本地伺服器檔案放到PDF中,那麼會怎樣呢?例如,我們可以使其作為影象中的一部分顯示。於是,我們嘗試著將<img src=”/etc/passwd”>新增到模板中,再對其進行Base64編碼和URL編碼,替換掉Burp Suite攔截資料包中的pdf引數,併發送出去。
然而,這樣的操作並不起作用,PDF生成器無法將這個檔案識別成影象,並且也不會在輸出中解析其中的內容。
再次嘗試:識別PDF庫,查詢庫中的漏洞
也許我們可以採取另一種方法,使PDF中包含檔案。首先,我們需要找到用於生成PDF的工具。藉助Google,我們搜尋了模板中一些有特點的字串,得到了如下搜尋結果。
現在,我們有兩個選擇:node-html-pdf庫或mPDF庫。在快速閱讀了這兩個庫的文件後,我們發現它實際上是在這個專案中使用的mPDF庫。
定位mPDF中的安全問題
我們立刻製作了一個mPDF的本地副本,以便檢查它是否存在安全漏洞。一個比較好的起點是CHANGELOG,開發人員通常都使用該檔案來跟蹤版本之間的變化。
我們發現,在2017年10月19日的一次修改中,mPDF改變了他們處理註釋標籤的方式。因此,我們開始仔細檢視文件中的這一標籤。
在這裡面,沒有提到檔案包含。讓我們再次Google搜尋,看看是否有其他人發現過相關的問題。
我們閱讀了h0ng10提交的漏洞報告, 發現舊版本的mPDF存在嚴重的安全問題,其中有一個位置,能夠以註釋標記的方式包含檔案。
接著,我們仔細查看了這個專案的Github提交,發現了其中有一段易受攻擊的mPDF程式碼。
因此,我們可以對PDF的模板進行更改,找到上述漏洞詳情所提到的標籤位置,並嘗試對其進行漏洞利用。
攻擊過程
我們將以下標記新增到模板中:
<annotation file=\”/etc/passwd\” content=\”/etc/passwd\” icon=\”Graph\” title=\”Attached File: /etc/passwd\” pos-x=\”195\” />
隨後,使用Burp Suite Repeater傳送新模板並下載PDF檔案。完成後,我們再用Foxit Reader開啟檔案,並開始尋找註釋標記(如圖中標黃的位置所示)。

雙擊這一標記,就能夠開啟從伺服器上獲取到的檔案,由此證明,我們的攻擊獲得了成功。
IKEA.com網站上提供了一個為使用者匯出PDF版本購物清單的功能,而該功能中所使用的PDF庫受漏洞影響,允許攻擊者通過在模板中新增特定標記,將檔案嵌入到PDF中。這一功能在最新版本的該PDF庫中已被禁用,但IKEA未將使用的PDF庫更新到最新版本,因此我們成功利用了這一漏洞。在嘗試中,我們證明了能夠越權獲得IKEA Web伺服器上的檔案,併成功得到了其生產伺服器上/etc/passwd檔案。
修復方案
不允許使用者操縱PDF模板;
在客戶端渲染包含購物清單的PDF,可以使用jsPDF;
更新到最新版本的mPDF庫,禁用註釋程式碼。
時間節點
2018年6月16日 發現此漏洞,通過Zerecopter提交漏洞詳情
2018年6月17日 發現PDF生成功能已經被禁用(推測是IKEA通過IDS發現我們獲取到了敏感檔案)
2018年6月18日 Zerocopter無法確認漏洞是否存在(因為PDF生成功能已被禁用),但根據報告中的內容,將這一漏洞情況通知IKEA
2018年6月25日 請求Zerocopter向我們同步當前進展
2018年6月27日 Zerocopter反饋:IKEA在6月19日就開始修復這一問題
2018年8月9日 經過多次溝通,確認IKEA已修復這一漏洞
2018年8月13日 Zerocopter建議我在公開漏洞詳情時,隱去IKEA的名稱
2018年8月20日 經過與IKEA團隊的反覆溝通,要求按照“負責任的漏洞披露原則”進行漏洞詳情公開
2018年9月11日 獲得Zerocopter的250歐元漏洞獎勵
2018年9月17日 在多次協商溝通後,IKEA終於對“負責任的漏洞披露原則”進行了正確理解,並正式授權我可以披露漏洞詳情
2018年9月18日 釋出漏洞詳情