美國留學(xué)選擇什么專業(yè)好?留學(xué)美國熱門專業(yè)推薦
2019-06-26
更新時(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ù)。