一.XSS攻擊的原理
XSS的原理是WEB應(yīng)用程序混淆了用戶(hù)提交的數(shù)據(jù)和JS腳本的代碼邊界钙蒙,導(dǎo)致瀏覽器把用戶(hù)的輸入當(dāng)成了JS代碼來(lái)執(zhí)行福扬。XSS的攻擊對(duì)象是瀏覽器一端的普通用戶(hù)腕铸。
二.XSS攻擊的分類(lèi)
1.反射型XSS
反射型XSS,又稱(chēng)非持久型XSS忧换。也就是攻擊相當(dāng)于受害者而言是一次性的恬惯,具體表現(xiàn)在受害者點(diǎn)擊了含有的惡意JavaScript腳本的url,而Web應(yīng)用程序只是不加處理的把該惡意腳本“反射”回受害者的瀏覽器而使受害者的瀏覽器執(zhí)行響應(yīng)的腳本亚茬。
2.存儲(chǔ)型XSS
存儲(chǔ)型XSS酪耳,也就是持久型XSS。攻擊者上傳的包含惡意js腳本的留言等信息被Web應(yīng)用程序保存到數(shù)據(jù)庫(kù)中刹缝,Web應(yīng)用程序在生成新的頁(yè)面的時(shí)候如果包含了該惡意js腳本碗暗,這樣會(huì)導(dǎo)致所有訪(fǎng)問(wèn)該網(wǎng)頁(yè)的瀏覽器解析執(zhí)行該惡意腳本。這種攻擊類(lèi)型一般常見(jiàn)在博客梢夯、論壇等網(wǎng)站中言疗。
3.DOM型XSS
DOM,全稱(chēng)是Document Object Model颂砸,是一個(gè)平臺(tái)和語(yǔ)言都中立的接口噪奄,可以使程序和腳本能夠動(dòng)態(tài)訪(fǎng)問(wèn)和更新文檔的內(nèi)容死姚、結(jié)構(gòu)和樣式。
DOM型XSS其實(shí)是一種特殊類(lèi)型的反射型XSS勤篮,它是基于DOM文檔對(duì)象模型的一種漏洞都毒,而且不需要與服務(wù)器進(jìn)行交互。
客戶(hù)端的腳本程序可以通過(guò)DOM來(lái)動(dòng)態(tài)修改頁(yè)面內(nèi)容碰缔,從客戶(hù)端獲取DOM中的數(shù)據(jù)并在本地執(zhí)行账劲。基于這個(gè)特性金抡,就可以利用JS腳本來(lái)實(shí)現(xiàn)XSS漏洞的利用瀑焦。
三、XSS攻擊的主要途徑
SQL注入的事件已經(jīng)是上個(gè)世紀(jì)最令人頭疼的攻擊方法梗肝,21世紀(jì)又出現(xiàn)了HTML注入漏洞榛瓮,隨著web飛速的發(fā)展,XSS漏洞已經(jīng)不容忽視统捶,簡(jiǎn)單介紹一下XSS漏洞, 只要有用戶(hù)輸入的地方榆芦,就會(huì)出現(xiàn)XSS漏洞,例如在發(fā)表一篇帖子的時(shí)候喘鸟,在其中加入腳本匆绣。
1.HTML標(biāo)簽注入:
<script>alert('Hello World!')</script>
很簡(jiǎn)單,就是用alert輸出一個(gè)Hello World文本什黑,如果在帖子內(nèi)容里崎淳,出現(xiàn)了這樣的語(yǔ)句,瀏覽器會(huì)執(zhí)行這個(gè)腳本:
很多網(wǎng)站為了避免XSS的攻擊愕把,對(duì)用戶(hù)的輸入都采取了過(guò)濾拣凹,最常見(jiàn)的就是對(duì)<>轉(zhuǎn)換成<以及>,經(jīng)過(guò)轉(zhuǎn)換以后<>雖然可在正確顯示在頁(yè)面上恨豁,但是已經(jīng)不能構(gòu)成代碼語(yǔ)句了嚣镜。這個(gè)貌似很徹底,因?yàn)橐坏?lt;>被轉(zhuǎn)換掉橘蜜,什么<script src=1.js></script>就會(huì)轉(zhuǎn)換成“<script src=1.js></script>”菊匿,不能執(zhí)行,因此计福,很多人認(rèn)為只要用戶(hù)的輸入沒(méi)有構(gòu)成<>跌捆,就不能閉合前后的標(biāo)簽,其語(yǔ)句當(dāng)然也不會(huì)有害象颖,但是佩厚,萬(wàn)事總有可能,只要有一定的條件说订,我們就可以構(gòu)造經(jīng)過(guò)編碼后的語(yǔ)句來(lái)進(jìn)行XSS抄瓦,稍候我會(huì)提到16進(jìn)制潮瓶、8進(jìn)制轉(zhuǎn)換,以及混合轉(zhuǎn)換闺鲸。
2. HTML屬性注入
于是程序員想辦法封堵這個(gè)漏洞筋讨,過(guò)濾了<script></script> 標(biāo)簽,那么在頁(yè)面上就不會(huì)執(zhí)行這段js代碼摸恍,
于是乎,黑客想了一個(gè)不用<script>標(biāo)簽的辦法赤屋,注入html立镶, 怎么回事呢?
是這樣:
<img src='http://dl.iteye.com/upload/picture/pic/94494/0a949350-1644-3d50-9b13-b028f4891981.png'>
正常情況下类早,img的src標(biāo)簽是指向一個(gè)web服務(wù)器的圖片URL媚媒,但是也可以替換為:
<img src='javascript:alert("Hello world!")'>
這樣黑客通過(guò)繞道的形式,繞開(kāi)了程序員的過(guò)濾涩僻,順利執(zhí)行了XSS攻擊
程序員見(jiàn)況缭召,同理有過(guò)濾了用戶(hù)輸入的src屬性,過(guò)濾掉里邊的javascript開(kāi)頭的關(guān)鍵字逆日,暫時(shí)封堵了XSS嵌巷。
3.ASCII 10進(jìn)制轉(zhuǎn)換繼續(xù)XSS
javascript:alert("Hello world!")可以用HTML 10進(jìn)制ASCII編碼代替:
格式:&#(ASCII10進(jìn)制編碼);
javascript:alert("Hello world!")
img標(biāo)簽變?yōu)椋?/p>
<img src='javascript:alert("Hello world!")' />
ASCII 10進(jìn)制轉(zhuǎn)換,同樣適合于HTML標(biāo)簽注入:
例如:
把<script>alert("Hello world");</script>標(biāo)簽轉(zhuǎn)換成10進(jìn)制 ASCII轉(zhuǎn)義字符:
<script>alert("Hello world");</script>";
接下來(lái)室抽,使用URL編碼得到:
%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%22%48%65%6C%6C%6F%20%77%6F%72%6C%64%22%29%3B%3C%2F%73%63%72%69%70%74%3E
然后放入到參數(shù)中:
接著程序員用JSP得到參數(shù)
<% string str_a = rrequest.getParameter("a");%>
var a= <%=str_a%>
document.write(a);
同樣會(huì)引發(fā)XSS漏洞
4. ASCII 16進(jìn)制轉(zhuǎn)換
格式: &#x(ASCII16進(jìn)制編碼);
<img src="javascript:alert('b')">
與10進(jìn)制ASCII轉(zhuǎn)義一樣搪哪,只不過(guò)換了一種進(jìn)制規(guī)則表示
5. ASCII 8進(jìn)制轉(zhuǎn)換
其實(shí)16進(jìn)制還有一種表現(xiàn)形式,與8進(jìn)制類(lèi)似
格式:\x(ASCII 16進(jìn)制編碼)
格式:(ASCII 8進(jìn)制編碼)
例如:
<script>alert("Hello world!");</script>
轉(zhuǎn)換為16進(jìn)制是:
\x3C\x73\x63\x72\x69\x70\x74\x3E\x61\x6C\x65\x72\x74\x28\x22\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x21\x22\x29\x3B\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E
八進(jìn)制是去掉\后的x坪圾,數(shù)值轉(zhuǎn)換為8進(jìn)制數(shù)值即可晓折,我就懶的自己轉(zhuǎn)了,有興趣大家可以試試
同樣以構(gòu)造URL參數(shù)兽泄,或者HTML屬性的形式注入到HTML當(dāng)中漓概,即可產(chǎn)生XSS漏洞
6. 8進(jìn)制、10進(jìn)制病梢、16進(jìn)制混合轉(zhuǎn)換
道理一樣胃珍,只不過(guò)一段代碼中的進(jìn)制數(shù)混合,自由構(gòu)造飘千,組合比較多
7. 加入混淆字符
這樣做的目的還是為了繞開(kāi)程序員代碼的過(guò)濾堂鲜, 其中加入一些混淆轉(zhuǎn)義字符,在系統(tǒng)控制字符中,除了頭部的�(null)和尾部的?(del)外护奈,其他31個(gè)字符均可作為混淆字符缔莲,比如、等字符都可插入到j(luò)avascript或vbscript的頭部霉旗,其中Tab符 痴奏、換行符蛀骇、回車(chē)符還可以插入到代碼中任意地方, 當(dāng)然還包括字母的大小寫(xiě)混合;
這里我摘抄了網(wǎng)上的一些例子:
例1:<img src="javascript:alert(/a/)"> '/插入到代碼頭部,其中可寫(xiě)成读拆,效果一樣
例2:<img src="java scr ipt:alert(/a/)"> '/插入到代碼中任意位置擅憔,其中 可寫(xiě)成
例3:<IMG SRC="jav ascript:alert('XSS')"> '/ 是回車(chē)符的16進(jìn)制形式
例4:<IMG SRC="jav ascript:alert('XSS')"> '/ 是換行符的16進(jìn)制形式
例5:workbench/login_light?from=1234%27;prompt(1);//
四.XSS攻擊的防御方法
1.對(duì)輸入(和URL參數(shù))進(jìn)行過(guò)濾,對(duì)輸出進(jìn)行編碼檐晕。
對(duì)提交的所有內(nèi)容進(jìn)行過(guò)濾暑诸,對(duì)url中的參數(shù)進(jìn)行過(guò)濾,過(guò)濾掉會(huì)導(dǎo)致腳本執(zhí)行的相關(guān)內(nèi)容辟灰;然后對(duì)動(dòng)態(tài)輸出到頁(yè)面的內(nèi)容進(jìn)行html編碼个榕,使腳本無(wú)法在瀏覽器中執(zhí)行。雖然對(duì)輸入過(guò)濾可以被繞過(guò)芥喇,但是也還是會(huì)攔截很大一部分XSS攻擊西采。
為了避免反射式或存儲(chǔ)式的XSS漏洞,最好的辦法是根據(jù)HTML輸出的上下文(包括:主體继控、屬性械馆、JavaScript、CSS或URL)對(duì)所有不可信的HTTP請(qǐng)求數(shù)據(jù)進(jìn)行恰當(dāng)?shù)霓D(zhuǎn)義武通。
在客戶(hù)端修改瀏覽器文檔時(shí)霹崎,為了避免DOM型XSS攻擊,最好的選擇是實(shí)施上下文敏感數(shù)據(jù)編碼厅须。