在HTML頁(yè)面中,標(biāo)簽廣泛用于嵌入另一個(gè)文檔。很多廣告引擎依靠使用這個(gè)標(biāo)簽來(lái)顯示在網(wǎng)站中嵌入的營(yíng)銷部件。 ? ? ? ?與其他HTML標(biāo)簽和功能類似,同樣可被用于承載攻擊。只要想實(shí)現(xiàn)持久化,內(nèi)嵌框架總是首選方案,為什么這么說(shuō)呢?南昌網(wǎng)絡(luò)公司小編認(rèn)為有以下兩個(gè)原因: ? ? ? ?第一,你可以完全控制內(nèi)嵌框架的DOM內(nèi)容,也就是說(shuō)CSS內(nèi)容也可以控制; ? ? ? ?第二,內(nèi)嵌框架主要用于在當(dāng)前頁(yè)面嵌入其他文檔的事實(shí),為持久化通信渠道提供了直截了當(dāng)?shù)姆椒ā?br /> ? ? ? ?不過(guò)由于可以控制內(nèi)嵌框架中的DOM,包括HTML、CSS和JavaScript,所以你也可以利用內(nèi)嵌框架把當(dāng)前頁(yè)面加載到一個(gè)疊加層里,從而在后臺(tái)保持通信渠道暢通。所謂疊加層,指的是一個(gè)頁(yè)面組件,比如一個(gè)內(nèi)嵌框架可以在頁(yè)面上看到,但代碼及其他元素在后臺(tái)并不可見(jiàn),而是持續(xù)執(zhí)行自己的邏輯。此外,HTML5的History API也很方便,特別適合在地址欄中遮蔽真正的URL。 ? ? ? ?設(shè)想一個(gè)Web應(yīng)用在用戶認(rèn)證前存在反射型XSS漏洞。你已經(jīng)勾連目標(biāo),但XSS并不持久。為了防止丟失到目標(biāo)瀏覽器的連接,你可以創(chuàng)建一個(gè)疊加層內(nèi)嵌框架。這個(gè)內(nèi)嵌框架沒(méi)有邊框,寬度和高度都是100%,源屬性指向該Web應(yīng)用的登錄頁(yè)面。 ? ? ? ?在內(nèi)嵌框架渲染后的極短時(shí)間內(nèi),被勾連瀏覽器會(huì)顯示登錄頁(yè)面的內(nèi)容,但地址欄中的URI仍然是以前的。而目標(biāo)在這個(gè)頁(yè)面上執(zhí)行的任何操作都會(huì)在疊加層內(nèi)嵌框架中發(fā)生,相當(dāng)于把目標(biāo)有效地捕獲到了一個(gè)新框架內(nèi)。與此同時(shí),在后臺(tái),通信渠道仍然運(yùn)行,你還可以繼續(xù)發(fā)送命令,與目標(biāo)瀏覽器交互。 ? ? ? ?目標(biāo)不可能發(fā)現(xiàn)攻擊,唯一可能引起注意的事件,就是渲染內(nèi)嵌框架時(shí)發(fā)生的頁(yè)面重載,以及瀏覽器地址欄中包含了與目標(biāo)期望不一樣的URI。 ? ? ? ?下面南昌網(wǎng)絡(luò)公司小編為大家介紹展示一下使用jQuery創(chuàng)建一個(gè)疊加內(nèi)嵌框架的過(guò)程。 ? ? ? ?createIframe: function(type, params, styles, onload) { ? ? ? ?var css = {}; ? ? ? ?if (type == 'hidden') { ? ? ? ?css = $j.extend(true, { ? ? ? ?'border':'none', 'width':'1px', 'height':'1px', ? ? ? ?'display':'none', 'visibility':'hidden'}, ? ? ? ?styles); ? ? ? ?} ? ? ? ?if (type == 'fullscreen') { ? ? ? ?css = $j.extend(true, { ? ? ? ?'border':'none', 'background-color':'white', 'width':'100%', ? ? ? ?'height':'100%', ? ? ? ?'position':'absolute', 'top':'0px', 'left':'0px'}, ? ? ? ?styles); ? ? ? ?$j('body').css({'padding':'0px', 'margin':'0px'}); ? ? ? ?} ? ? ? ?var iframe = $j('').attr(params).css( ? ? ? ?css).load(onload).prependTo('body'); ? ? ? ?return iframe; ? ? ? ?} ? ? ? ?從上面可以看出:這個(gè)函數(shù)可以創(chuàng)建疊加層(if type == 'fullscreen'),也可以創(chuàng)建隱藏的內(nèi)嵌框架。 ? ? ? ?從代碼看,創(chuàng)建這兩種內(nèi)嵌框架的區(qū)別就是CSS選擇符不同。如果是隱藏的內(nèi)嵌框架,就使用最小的框架大?。?像素),而且沒(méi)有邊框,再使用visibility和display屬性使其不可見(jiàn)。如果是層疊式嵌入框架,則元素尺寸最大化,刪除窗口上部和左側(cè)多余的空間。 ? ? ? ?為了通過(guò)層疊式內(nèi)嵌框架嵌入文檔,需要通過(guò)自定義的CSS選擇器刪除其邊框,并正確將新元素定位,包括控制它在瀏覽器窗口的大小。正確的大小是外邊距和內(nèi)邊距均為0,高度和寬度均為100%。如果利用這些屬性再加上絕對(duì)元素定位,就可以得到與當(dāng)前瀏覽器窗口邊框完美匹配的內(nèi)嵌框架。 ? ? ? ?前面的例子使用jQuery擴(kuò)展了已有的CSS樣式。創(chuàng)建層疊式內(nèi)嵌框架時(shí),可以像下面的代碼這樣調(diào)用createIframe函數(shù)。在這個(gè)例子中,加載了同源頁(yè)面login.jsp,沒(méi)有傳入任何CSS規(guī)則或回調(diào)。 ? ? ? ?createIframe('fullscreen',{'src':'/login.jsp'}, {}, null); ? ? ? ?如果初始勾連的頁(yè)面不一樣,比如是/page.jsp,那么用戶可能發(fā)現(xiàn)疊加了內(nèi)嵌框架后的結(jié)果有問(wèn)題。頁(yè)面的內(nèi)容來(lái)自/login.jsp,而瀏覽器地址欄中顯示的卻是/page.jsp。為了解決這個(gè)問(wèn)題,可以利用HTML5 History API13: ? ? ? ?history.pushState({be:"EF"}, "page x", "/login.jsp"); ? ? ? ?執(zhí)行前面的代碼會(huì)讓瀏覽器把地址欄中顯示的內(nèi)容改成http://<勾連的域>/login.jsp。 ? ? ? ?很明顯,為了安全起見(jiàn),必須向pushState傳入一個(gè)同源的URL,否則就可能觸發(fā)安全警報(bào)。使用pushState操縱瀏覽器地址欄最有意思的是,瀏覽器并不會(huì)加載指定的資源,比如這里的/login.jsp,而且這個(gè)資源都不一定需要真實(shí)存在。 ? ? ? ?最后,南昌網(wǎng)站建設(shè)公司-百恒網(wǎng)絡(luò)想告訴大家的是:利用內(nèi)嵌框架實(shí)現(xiàn)對(duì)目標(biāo)瀏覽器的持續(xù)控制,只是可供使用的多種技術(shù)之一。這種技術(shù)的優(yōu)點(diǎn)是得到瀏覽器廣泛支持,而在當(dāng)前內(nèi)容上疊加相同內(nèi)容更具隱蔽性,不容易被發(fā)現(xiàn)。不過(guò)這種技術(shù)也有局限性。如果你想嵌入的內(nèi)容中包含擴(kuò)張內(nèi)嵌框架的代碼, 或者限制性X-Frame-Options首部,那就要使用其他技術(shù)了,如果想深入了解這些技術(shù)的朋友,歡迎繼續(xù)關(guān)注百恒網(wǎng)絡(luò)官網(wǎng)動(dòng)態(tài)。同時(shí),百恒網(wǎng)絡(luò)專業(yè)為您提供網(wǎng)站建設(shè)、微信開(kāi)發(fā)、手機(jī)APP開(kāi)發(fā)等服務(wù),如有需要,隨時(shí)歡迎和我們聯(lián)系,我們將專業(yè)為您服務(wù)!