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