某日,當我正在漏洞賞金項目挖掘漏洞時,突然發現目標網站有一個有趣的現象。假設網站是censored.com,根據用戶是否經過許可權驗證,訪問該網站時所返回的頁面有很大的不一樣:一個返回請求中content-typetext/html;charset=utf-8;另一個根本沒有Content-Type頭,在這種情況下Content-Type默認為text/plain。此時我心中出現很多疑問:有沒有一種聰明的方法可以區分這兩種回應?可以推廣到所有網站嗎?這到底構成了什麼安全威脅?

讓我們先看看這裡面蘊含的安全威脅,乍一看可能並不明顯,但這是一個嚴重的信息泄漏,且影響多個網站。在具體的應用中,攻擊者可以了解到受害者是否有許可權獲取另一網站(例如Facebook.com)上某個特定的資源,基於不同的結果,會暴露出受害者在第三方網站的身份許可權。

在某些情況下,造成的影響可能比去匿名更嚴重。於是,我開始向這個方向研究,我相信肯定會有成果的。我開始研究MDN Web文檔,希望找到任何有用的HTML屬性。沒過多久,我就有了結果。

HTMLob jectElement.typeMustMatch屬性是一個布爾值,具體為<object>元素里的typemustmatch屬性。只有<object>內部的資源類型和HTMLobjectElement.type指定的MIME類型相同,才能正常載入此資源。[1]

找到這個屬性後,我開始在Chrome中進行實驗。但是,一直沒看到效果,似乎該屬性被瀏覽器完全忽略了。實際上,這裡涉及到瀏覽器的兼容性。經過Eduardo的提示,我便發現它能在Firefox中生效。

如果content-typeHTML <object>里的type屬性不同,資源就不會載入。不幸的是,<object>里並不能使用onload以及onerror事件,因此,檢測載入狀態又是一個難題。

Eduardo還提出了一個有趣的想法,即在<object>內部使用內聯元素來檢測載入狀態。

<object type= data= typemustmatch> not_loaded </object>

簡單來說,如果not_loaded文本被渲染,要麼type屬性與content-type不相同,要麼伺服器響應的狀態不等於HTTP 200 OK。我現在依然還在測試這種方法。

在仔細觀察<object>的屬性後,我注意到,<object>.clientHeight<object>.clientWidth的值在不同情況下有所不同。這些屬性主要代表渲染後對象的寬和高。如果對象未被渲染,則尺寸為0。此外,只有在伺服器響應HTTP 200 OK時才會渲染對象。我不確定伺服器的響應狀態會不會影響我的攻擊測試?[2]

最後,我們還需要檢測<object>何時載入。如果我們不知道載入時間,就不好確定何時讀取height屬性。一個天真的解決方案是等一定的時間,然後讀取屬性,但這實在太浪費時間,而且很不穩定。

雖然<object>不能觸發onload事件,但window對象肯定能。在window中,只有所有組件(例如iframe)載入完成,才會觸發事件。因此,我創建一個iframe,把<object>放置其中,同時利用onload事件,就可以靈活而迅速地讀取<object>height

這種利用<object>.onload檢測<object>渲染結果的方法,我認為是一種全新的跨源內容和狀態類型檢測技術

以下是我製作的一個PoC,能檢測你訪問資源的content-type,希望你喜歡!(記住在Firefox中使用它)

PoC在網址medium.com/bugbountywri的最後面

感謝你的閱讀!

本文由白帽彙整理並翻譯,不代表白帽匯任何觀點和立場

來源:「Content-Type」導致的另類信息泄露|NOSEC安全訊息平台 - NOSEC.ORG

原文:medium.com/bugbountywri

白帽匯從事信息安全,專註於安全大數據、企業威脅情報。

公司產品:FOFA-網路空間安全搜索引擎、FOEYE-網路空間檢索系統、NOSEC-安全訊息平台。

為您提供:網路空間測繪、企業資產收集、企業威脅情報、應急響應服務。


推薦閱讀:
相关文章