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