红菊直播官方版-红菊直播免费版app下载-红菊直播永久免费版下载

網(wǎng)站首頁
手機(jī)版

Gmail中AMP4Email所導(dǎo)致的XSS漏洞

更新時(shí)間:2024-06-11 09:41作者:小樂

本文討論的是我在2019 年8 月向Google 報(bào)告的XSS 漏洞,該漏洞與Gmail 中的AMP4Email 有關(guān)。這也是DOM Clobbering攻擊技術(shù)的具體實(shí)現(xiàn)。

什么是AMP4Email AMP4Email(也稱為動(dòng)態(tài)電子郵件)是Gmail 的一項(xiàng)新功能,允許電子郵件包含動(dòng)態(tài)HTML 內(nèi)容。盡管很早以前就可以編寫包含HTML 標(biāo)記的電子郵件,但這通常只包含靜態(tài)內(nèi)容,即一些格式、圖像等,沒有任何腳本或表單。 AMP4Email 意味著更進(jìn)一步,向電子郵件添加更多動(dòng)態(tài)內(nèi)容。在Google官方的一篇文章中,有完整的總結(jié):

使用動(dòng)態(tài)電子郵件,您可以輕松地直接對(duì)郵件本身執(zhí)行操作,例如回復(fù)事件、填寫調(diào)查問卷、瀏覽目錄或評(píng)論等。以Google 文檔中的評(píng)論為例。當(dāng)有人在評(píng)論中提及您時(shí),您不會(huì)收到單獨(dú)的電子郵件。相反,您可以直接從消息中回復(fù)評(píng)論(您可以觀察Gmail 分出一條線索)。然而,這一功能也引發(fā)了一些明顯的安全問題,其中最明顯的就是XSS。在電子郵件中插入動(dòng)態(tài)內(nèi)容是否意味著我們可以輕松注入任意JavaScript 代碼?不,這實(shí)際上并不容易。

AMP4Email 有一個(gè)強(qiáng)大的驗(yàn)證器。簡而言之,它有一個(gè)強(qiáng)大的白名單,可以限制某些HTML 標(biāo)簽的使用。具體情況可以通過https://amp.gmail.dev/playground/查看(如下圖),也可以給自己發(fā)一封動(dòng)態(tài)郵件看看效果如何!

當(dāng)您嘗試添加惡意HTML 標(biāo)記時(shí),您會(huì)看到錯(cuò)誤。

當(dāng)我嘗試各種方法來繞過安全限制時(shí),我注意到我可以將id 屬性寫入標(biāo)簽。

這似乎是一個(gè)很好的起點(diǎn),因?yàn)閯?chuàng)建包含自定義id 屬性的HTML 元素可能會(huì)導(dǎo)致DOM 破壞。

DOM 破壞

DOM 破壞是Web 瀏覽器的一項(xiàng)舊功能,可能會(huì)給許多應(yīng)用程序帶來麻煩。一般來說,當(dāng)您創(chuàng)建一個(gè)元素(例如)然后想要從javascript 引用它時(shí),通常使用document.getElementById('username') 或document.querySelector('#username') 。但這些還不是全部方法!

傳統(tǒng)的方法是通過全局window對(duì)象的屬性來訪問,比如window.username。所以在上面的例子中,這與document.getElementById('username') 完全相同!如果此時(shí)應(yīng)用的某些操作完全基于某些全局變量,則可能會(huì)導(dǎo)致DOM Cloberring!

為了進(jìn)一步分析DOM Clobbering,假設(shè)我們有以下javascript 代碼:

if (window.test1.test2) { eval(''+window.test1.test2)} 此時(shí)我們的目標(biāo)是只使用DOM Clobbering 技術(shù)來實(shí)現(xiàn)JS 代碼。為此,我們需要解決以下兩個(gè)問題:

我們知道我們可以為window 創(chuàng)建新屬性,但是我們可以在其他對(duì)象(例如test1.test2)上創(chuàng)建新屬性嗎?我們可以控制DOM 元素轉(zhuǎn)換為字符串的過程嗎?大多數(shù)HTML 元素在轉(zhuǎn)換為字符串時(shí)都會(huì)生成類似[object HTMLInputElement] 的結(jié)果。讓我們從第一個(gè)問題開始,最常見的解決方案是使用而為了解決第二個(gè)問題,我編寫了一段簡短的JS 代碼,它遍歷HTML 中所有可能的元素,檢查它們的toString 方法是否繼承自object。如果沒有,可能會(huì)返回其他對(duì)象。代碼如下所示:

object.getOwnPropertyNames(window).filter(p=p.match(/Element$/)).map(p=window[p]).filter(p=p p.prototype p.prototype.toString !==對(duì)象。 prototype.toString) 上面的代碼返回兩個(gè)元素:HTMLAreaElement() 和HTMLAnchorElement()。在AMP4Email中,第一個(gè)不在白名單中,因此只能使用第二個(gè)。其中,toString函數(shù)只返回href屬性的值:

因此,如果我們想要執(zhí)行攻擊(通過window.test1.test2的值),我們需要類似于以下的代碼:

但問題是它根本不起作用。 test1.test2 未定義。只需將其替換為.

然而,這個(gè)問題有一個(gè)有趣的解決方案,可以在WebKit 和基于眨眼的瀏覽器中運(yùn)行。假設(shè)我們有兩個(gè)具有相同id 的元素:

click!click2!此時(shí)訪問window.test1會(huì)得到什么?我希望得到第一個(gè)的值。但在Chromium 中我們實(shí)際上得到了一個(gè)HTMLCollection!

特別是,我們可以通過索引和id 訪問HTMLCollection 中的特定元素。這意味著window.test1.test1 實(shí)際上引用了第一個(gè)元素。我們還可以設(shè)置name屬性來達(dá)到同樣的效果:

點(diǎn)擊!點(diǎn)擊2!現(xiàn)在我們可以通過window.test1.test2訪問第二個(gè)錨元素。

現(xiàn)在,我們回到eval(''+window.test1.test2),最終的答案是:

那么,我們?nèi)绾卧贏MP4Email 中使用它呢?

實(shí)施攻擊如上所述,AMP4Email 很可能通過向元素添加id 屬性來受到攻擊。為了找到一些攻擊條件,我決定檢查窗口的屬性。

AMP4Email 實(shí)際上對(duì)DOM Clobbering 使用了一些安全措施,例如它嚴(yán)格禁止id 屬性的某些值。

然而,AMP_MODE 不受限制。那么讓我們看看會(huì)發(fā)生什么。

看來AMP4Email嘗試加載一些Js文件,但由于404而失敗。我們可以看到URL中間有一個(gè)未定義的內(nèi)容,對(duì)于為什么會(huì)發(fā)生這種情況我只能想出一個(gè)解釋:AMP正在嘗試獲取AMP_MODE 屬性并將其插入U(xiǎn)RL 中。但由于DOM Clobbering,預(yù)期的屬性丟失了。相關(guān)代碼如下:

f.preloadExtension=function(a, b) { 'amp-embed'==a (a='amp-ad'); var c=fn(this, a,1); if (c.loaded || c .error) var d=!1; else void 0===c.scriptPresent (d=this.win.document.head.querySelector('[custom-element='' + a + '']'), c.scriptPresent=!d), d=!c.scriptPresent;如果(d) { d=b; b=this.win.document.createElement('script'); b.async=!0; yb(a, '_') d='' : b.setAttribute(0=dn.indexOf(a) '自定義模板' : '自定義元素', a); b.setAttribute('數(shù)據(jù)腳本', a); b. setAttribute('i-amphtml-插入', ''); var e=this.win.location; t().test this.win.testLocation (e=this.win.testLocation); if (t().localDev ) { var g=e.protocol + '//' + e.host; 'about:'==e.protocol(g=''); e=g + '/dist' } else e=hd.cdn; g=t().rtvVersion; null==d(d='0.1'); d=d'-' + d :''; var h=t().singlePassType t().singlePassType + '/' : ' '; b.src=e + '/rtv/' + g + '/' + h + 'v0/' + a + d + '.js'; this.win.document.head.appendChild(b); c .scriptPresent=!0 } return gn(c) }以下是簡化版本:

var script=window.document.createElement('script');script.async=false;var loc;if (AMP_MODE.test window.testLocation) { loc=window.testLocation} else { loc=window.location;}if ( AMP_MODE.localDev) { loc=loc.protocol + '//' + loc.host + '/dist'} else { loc='https://cdn.ampproject.org';}var singlePass=AMP_MODE.singlePassType AMP_MODE.singlePassType + '/' : '';b.src=loc + '/rtv/' + AMP_MODE.rtvVersion; + '/' + singlePass + 'v0/' + pluginName + '.js';document.head.appendChild(b);在第一行中,創(chuàng)建了一個(gè)新的腳本元素,然后檢查AMP_MODE.test 和window.testLocation 是否為true。如果AMP_MODE.localDev 為true,則使用window.testLocation 生成URL。最后一些其他屬性組合起來形成完整的URL。但由于編碼方法和DOM Clobbering 的缺陷,我們可以控制最終的URL。我們假設(shè)AMP_MODE.localDev 和AMP_MODE.test 都為true,以進(jìn)一步簡化代碼:

var script=window.document.createElement('script');script.async=false;b.src=window.testLocation.protocol + '//' + window.testLocation.host + '/dist/rtv/' + AMP_MODE .rtv版本; + '/' + (AMP_MODE.singlePassType AMP_MODE.singlePassType + '/' : '') + 'v0/' + pluginName + '.js';document.head.appendChild(b);還記得之前的window.test1.test2,我們只是做同樣的事情并重寫window.testLocation.protocol:

但實(shí)際情況下,由于Content-Security-Policy部署在AMP中,因此代碼并沒有被執(zhí)行:

Content-Security-Policy: default-src '無'; script-src 'sha512-oQwIl.==' https://cdn.ampproject.org/rtv/https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/所以后來我開始尋找繞過CSP的方法,當(dāng)然,我成功找到了它:https://twitter.com/SecurityMB/status/1162690916722839552。但我發(fā)現(xiàn)2016年就有人發(fā)現(xiàn)了同樣的方法。

如果您想了解更多信息,請(qǐng)點(diǎn)擊此處。

時(shí)間表2019 年8 月15 日 向Google 發(fā)送報(bào)告

2019 年8 月16 日 得到回復(fù)

2019 年9 月10 日 Google 確認(rèn)漏洞

2019 年10 月12 日 Google 確認(rèn)漏洞已修復(fù)

2019 年11 月18 日 詳情公布

本文由白浩輝編譯。不代表百豪匯任何觀點(diǎn)或立場。

資料來源:https://nosec.org/home/detail/3188.html

原文:https://research.securitum.com/xss-in-amp4email-dom-clobbering/

百浩匯從事信息安全領(lǐng)域,專注于安全大數(shù)據(jù)和企業(yè)威脅情報(bào)。

公司產(chǎn)品:FOFA-網(wǎng)絡(luò)空間安全搜索引擎、FOEYE-網(wǎng)絡(luò)空間檢索系統(tǒng)、NOSEC-安全信息平臺(tái)。

為您提供:網(wǎng)絡(luò)空間測繪、企業(yè)資產(chǎn)采集、企業(yè)威脅情報(bào)、應(yīng)急響應(yīng)服務(wù)。

為您推薦

“拋棄 Gmail!”

作者 | Roland Szabo譯者 | 香檳超新星,責(zé)編 | 郭芮頭圖 | CSDN 下載自視覺中國出品 | CSDN(ID:CSDNnews)以下為譯文:我喜歡PurelyMail,并且我會(huì)慢慢地把所有的網(wǎng)上帳戶都遷移到它上面。我已經(jīng)

2024-06-11 09:43

賬號(hào)受限后,如何與領(lǐng)英溝通解除限制?(領(lǐng)英被限制怎么辦)

前段時(shí)間,我們公司內(nèi)部進(jìn)行領(lǐng)英賬號(hào)測試調(diào)試,總會(huì)出現(xiàn)賬號(hào)能成功注冊,但第二天就被限制的情況。下面,我將我如何和領(lǐng)英友好溝通后解除限制的經(jīng)過給大家一一呈現(xiàn)出來。?大家可以認(rèn)真學(xué)習(xí)我在賬號(hào)限制后如何操作的,尤其是如何與領(lǐng)英官方通過郵件進(jìn)行溝通的

2024-06-11 09:42

我被馬斯克暴力裁員:凌晨門禁賬號(hào)一夜被封,沒補(bǔ)償,沒解釋 警告馬斯克

“瘋狂”的馬斯克,“善變”的馬斯克,發(fā)動(dòng)了一場劇烈而隨機(jī)的大裁員,讓推特員工經(jīng)歷了一個(gè)“黑色星期四”,而這只是“改造”的開始,他還要“釋放”美國前總統(tǒng)特朗普,在硅谷卷起996風(fēng)潮,甚至把推特打造成微信一樣的超級(jí)全能APP,將他的理念傳遞到全

2024-06-11 09:42

谷歌網(wǎng)盤 Google Drive 將審查用戶的文件,不正當(dāng)內(nèi)容禁止傳播(谷歌云端硬盤提示申請(qǐng)權(quán)限)

IT之家 12 月 19 日消息,谷歌宣布了其專有云存儲(chǔ) Google Drive 的新使用條款,根據(jù)該條款,谷歌將開始限制違規(guī)文件的訪問。根據(jù)谷歌官方博客,當(dāng) Google Drive 文件被認(rèn)定為違反服務(wù)條款或計(jì)劃政策時(shí),它可能會(huì)受到限

2024-06-11 09:41

全新的iOS版Gmail變得更好了,可我依然不會(huì)再用它了(apple gmail)

極客公園作者:早優(yōu)夫斯基Google 今天推出了全新的 iOS端 Gmail 郵箱,從外觀到功能都有小優(yōu)化,簡單來說就是——讓你的 iPhone 感覺更 Google 了。今天 Gmail 的改動(dòng)主要在外觀、搜索等方面,當(dāng)然更多了「撤銷」和

2024-06-11 09:40

谷歌Gmail安卓版更新:新增延后閱讀功能

IT之家4月26日消息伴隨著網(wǎng)頁版Gmail的全新改版,谷歌日前向用戶推送了最新版本的Gmail安卓客戶端。Gmail安卓客戶端新增了“延后”處理電子郵件的功能,并可以選擇何時(shí)在收件箱重新顯示。用戶在使用安卓版本Gmail瀏覽郵件時(shí),可以選

2024-06-11 09:40

加載中...