XSS攻擊的原理孽糖、分類(lèi)和防御方法

一.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è)腳本:

image.png

很多網(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)義字符:

&#60&#115&#99&#114&#105&#112&#116&#62&#97&#108&#101&#114&#116&#40&#34&#72&#101&#108&#108&#111&#32&#119&#111&#114&#108&#100&#34&#41&#59&#60&#47&#115&#99&#114&#105&#112&#116&#62";

接下來(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ù)中:

http://www.test.com/a=%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

接著程序員用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)控制字符中,除了頭部的&#00(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ù)編碼厅须。

2.使用內(nèi)容安全策略(CSP)是對(duì)抗XSS的深度防御策略仿畸。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市朗和,隨后出現(xiàn)的幾起案子错沽,更是在濱河造成了極大的恐慌,老刑警劉巖眶拉,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千埃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡忆植,警方通過(guò)查閱死者的電腦和手機(jī)放可,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)朝刊,“玉大人耀里,你說(shuō)我怎么就攤上這事∈懊ィ” “怎么了冯挎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)咙鞍。 經(jīng)常有香客問(wèn)我房官,道長(zhǎng)趾徽,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任翰守,我火速辦了婚禮孵奶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜡峰。我一直安慰自己了袁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布事示。 她就那樣靜靜地躺著早像,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肖爵。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天臀脏,我揣著相機(jī)與錄音劝堪,去河邊找鬼。 笑死揉稚,一個(gè)胖子當(dāng)著我的面吹牛秒啦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搀玖,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼余境,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了灌诅?” 一聲冷哼從身側(cè)響起芳来,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猜拾,沒(méi)想到半個(gè)月后即舌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挎袜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年顽聂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盯仪。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡紊搪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出全景,到底是詐尸還是另有隱情耀石,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布蚪燕,位于F島的核電站娶牌,受9級(jí)特大地震影響奔浅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诗良,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一汹桦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鉴裹,春花似錦舞骆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至总处,卻和暖如春狈惫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹦马。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工胧谈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荸频。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓菱肖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親旭从。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稳强,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容