幾個(gè)月前,我挖到了一個(gè)Twitter的XSS漏洞,同時(shí)繞過了站點(diǎn)的內(nèi)容安全策略(CSP)成功執(zhí)行了JavaScript代碼。在本篇文章中將主要向大家分享該XSS漏洞挖掘的思路及具體細(xì)節(jié),同時(shí)在文章中附帶了PoC演示視頻。
漏洞分析
存在漏洞的站點(diǎn)為https://apps.twitter.com,當(dāng)開發(fā)人員創(chuàng)建應(yīng)用時(shí)可以設(shè)置服務(wù)網(wǎng)站(Website)信息,用于提供對(duì)應(yīng)用程序更加詳細(xì)的描述,及應(yīng)用下載等功能。

經(jīng)過測(cè)試后發(fā)現(xiàn),Twitter的開發(fā)人員對(duì)該處輸入的內(nèi)容在服務(wù)端的正則校驗(yàn)可能是這樣:([https?:])\w+
細(xì)心的同學(xué)可能會(huì)發(fā)現(xiàn)這個(gè)正則表達(dá)式的開頭缺少^字符,當(dāng)我們輸入類似data:CONTENT#https://…這種url是可以通過驗(yàn)證的,所以此時(shí)我們已經(jīng)獲得了一個(gè)HTML注入。由于該站點(diǎn)CSP(內(nèi)容安全策略)的限制,此處注入HTML代碼并不會(huì)解析。
在對(duì)HTTP頭檢查后,我注意到script-src和object-src塊中有多個(gè)CSP(內(nèi)容安全策略)配置錯(cuò)誤,利用這些配置缺陷可能繞過twitter.com的CSP(內(nèi)容安全策略)。CSP的規(guī)則如下所示:
script-src https://connect.facebook.net https://cm.g.doubleclick.net https://ssl.google-analytics.com https://graph.facebook.com https://twitter.com 'unsafe-eval' 'unsafe-inline' https://*.twimg.com https://api.twitter.com https://analytics.twitter.com https://publish.twitter.com https://ton.twitter.com https://syndication.twitter.com https://www.google.com;frame-ancestors 'self';object-src https://twitter.com https://pbs.twimg.com; default-src 'self';...
看到這里,object-src和script-src塊立即引起了我的注意。經(jīng)過一番分析,我找到一個(gè)可信域(cdn.syndication.twimg.com 又名 syndication.twitter.com)主機(jī)的JSONP endpoints。
一開始我認(rèn)為,通過利用object-src塊的內(nèi)容(https://pbs.twimg.com),這個(gè)網(wǎng)站可以將Flash文件(as picture/video extension with few bytes header)上傳到Twitter的CDN服務(wù)器,將其作為嵌入式對(duì)象(embedded Object)以執(zhí)行代碼。然而由于對(duì)用戶輸入長度的限制,我試圖執(zhí)行的payload都因?yàn)檫^長而被截?cái)啵赃@種利用方式最后沒有成功。我找到一個(gè)可信域下可以利用的點(diǎn),寫出了一個(gè)較短的payload,當(dāng)注入到twitter.com的時(shí)候代碼執(zhí)行,成功彈窗。
http://syndication.twitter.com/widgets/timelines/246079887021051904?dnt=true&domain=site.com&lang=en&callback=alert
當(dāng)我們向服務(wù)端請(qǐng)求,來自syndication.twitter.com主機(jī)的JSONP響應(yīng)頭有一個(gè)Content-Disposition字段強(qiáng)制將返回的內(nèi)容作為文件下載。但是,Chrome瀏覽器即使將返回的內(nèi)容作為附件下載但由于配置錯(cuò)誤的“unsafe-inline”CSP(內(nèi)容安全策略)塊意味著我們?nèi)匀豢梢詧?zhí)行代碼。
通過設(shè)置服務(wù)網(wǎng)站(Website)信息如下:
data:text/html,

客戶端代碼將會(huì)執(zhí)行,彈窗。
PoC 演示視頻
后記
在后續(xù)的分析過程中我發(fā)現(xiàn)ssl.google-analytics.com、www.google.com還有g(shù)raph.facebook.com主機(jī)的JSONP endpoints也可以被利用,我已經(jīng)將其寫入到向Twitter報(bào)告漏洞的郵件中,但官方表示這些問題短期內(nèi)可能不會(huì)被修復(fù),以為這可能影響部分功能的正常使用,同時(shí)聯(lián)系其他廠商也需要一定的時(shí)間。
在這篇文章發(fā)布后Twitter上的研究員@Ben Hayak提示,我們也可以在該點(diǎn)展開同源方法執(zhí)行(SOME)攻擊,像這樣:
https://syndication.twitter.com/widgets/timelines/246079887021051904?callback=
document.body.firstElementChild.Reference.submit
|