什麼是跨網站指令碼?

Cross-site scripting 攻擊會誘騙 Web 瀏覽器執行惡意代碼。

學習目標

閱讀本文後,您將能夠:

  • 瞭解 Cross-site scripting
  • 定義用戶端代碼
  • 描述 Cross-site scripting 攻擊的後果
  • 說明反射和持續性 Cross-site scripting 之間的區別
  • 列出緩解 Cross-site scripting 的策略

相關內容


想要繼續瞭解嗎?

訂閱 TheNET,這是 Cloudflare 每月對網際網路上最流行見解的總結!

請參閱 Cloudflare 的隱私權政策,了解我們如何收集和處理您的個人資料。

複製文章連結

什麼是跨網站指令碼?

Cross-site scripting (XSS) 是一種漏洞利用,攻擊者將代碼附加到合法網站上,當受害者載入網站時,代碼就會執行。惡意代碼可以透過幾種方式插入。最常見的是新增到 URL 的末尾,或者直接發佈到顯示使用者所產生內容的頁面上。用更專業的詞彙來說,Cross-site scripting 是一種用戶端代碼插入攻擊。

Cross-site scripting 攻擊

什麼是用戶端代碼?

用戶端代碼是在使用者電腦上執行的 JavaScript 代碼。就網站而言,用戶端代碼通常是在瀏覽器載入網頁後由 Web 瀏覽器執行的代碼。這與伺服器端代碼相反——伺服器端代碼在主機的 Web 伺服器上執行。用戶端代碼對於互動式網頁非常有用;可以讓互動式內容的執行速度更快、更可靠,因為使用者的電腦不必在每次互動時都與 Web 伺服器進行通訊。基於瀏覽器的遊戲是熱門的用戶端代碼平台,因為用戶端代碼可以確保遊戲順利運行,而不用考慮連線問題。

在用戶端執行的代碼在現代 Web 開發中非常流行,並在大多數現代網站中得到利用。由於跨網站代碼是現代 Web 的基本內容,因此Cross-site scripting 已成為最常見的網路安全漏洞之一;Cross-site scripting 攻擊已攻擊了 YouTube、Facebook 和 Twitter 等知名網站。

有哪些 Cross-site scripting 的範例?

Cross-site scripting 攻擊的一個有用範例常見於具有未驗證評論論壇的網站。在這種情況下,攻擊者發佈評論,其中包含用「<script></script>」標記括起來的可執行代碼。這些標記告訴 Web 瀏覽器將標記之間的所有內容解讀為 JavaScript 代碼。評論出現在頁面上之後,任何其他使用者載入網站時,其 Web 瀏覽器將執行指令碼標記之間的惡意代碼,而使用者則成為攻擊的受害者。

攻擊者如何利用 Cross-site scripting 造成損害?

JavaScript Cross-site scripting 攻擊十分熱門,因為 JavaScript 可以存取一些敏感性資料,用於身分盜竊和其他惡意目的。例如,JavaScript 可以存取 cookie*,攻擊者可以利用 XSS 攻擊來竊取使用者的 cookie 並在線上冒充他們。JavaScript 還可以建立 HTTP 要求,這些要求可用於將資料(例如,被盜的 cookie)傳回給攻擊者。此外,用戶端 JavaScript 還可以協助攻擊者存取包含地理位置座標、網路攝影機資料和其他敏感性資訊的 API。

典型的 Cross-site scripting 攻擊流程如下:

  1. 受害者載入網頁,惡意代碼複製使用者的 Cookie
  2. 然後,代碼將 HTTP 要求傳送給攻擊者的 Web 伺服器,其中包含要求內文中的被盜 Cookie。
  3. 然後,攻擊者可使用這些 Cookie 在該網站上假冒該使用者,以進行社交工程攻擊,甚至存取銀行帳號或其他敏感性資料。

*Cookie 是儲存在使用者電腦上的臨時登入認證。例如,當使用者登入 Facebook 之類的網站時,該網站為他們提供一個 cookie,這樣,如果他們關閉瀏覽器視窗並在當日晚些時候回到 Facebook,將自動由該 cookie 進行驗證,而無需再次登入。

Cross-site scripting 有哪些不同類型?

最常見的兩種 Cross-site scripting 攻擊類型是反射式 Cross-site scripting 和持久性 Cross-site scripting。

反射式 Cross-site scripting

這是最常見的 Cross-site scripting 攻擊。透過反射攻擊,惡意代碼被新增到網站 URL 的末尾;通常,這是一個合法的、值得信賴的網站。當受害者在 Web 瀏覽器中載入此連結時,瀏覽器將執行插入到 URL 中的代碼。攻擊者通常使用某種形式的社交工程來誘騙受害者點擊連結。

例如,使用者可能會收到一封看起來合法的電子郵件,聲稱來自銀行。該電子郵件將要求使用者在銀行的網站上執行一些動作,並提供一個連結。該連結可能看起來像這樣:

http://legitamite-bank.com/index.php?user=<script>here is some bad code!</script>

儘管 URL 的第一部分看起來很安全,並且包含受信任網站的網域,但插入到 URL 末尾的代碼可能是惡意的。

持久性 Cross-site scripting

持久性 Cross-site scripting 發生的網站通常會允許使用者發佈其他使用者可看到的內容,例如評論論壇或社交媒體網站。如果網站沒有正確驗證使用者所產生內容的輸入,攻擊者可以插入代碼,當頁面在其他使用者的瀏覽器中載入時,瀏覽器將執行該代碼。例如,攻擊者可能會存取一個線上約會網站,在他們的設定檔中放置如下內容:

"Hi! My name is Dave, I enjoy long walks on the beach and <script>malicious code here</script>"

任何嘗試存取 Dave 設定檔的使用者都將成為 Dave 持續性 Cross-site scripting 攻擊的受害者。

如何防止 Cross-site scripting

沒有單一的策略可以緩解 Cross-site scripting,不同類型的 Web 應用程式需要不同層級的防護。可以採取一些保護措施,下面將簡要介紹其中一些方法。

盡可能避免在輸入中使用 HTML:避免持久性 Cross-site scripting 攻擊的一種非常有效的方法是防止使用者將 HTML 發佈到表單輸入中。有一些其他選項可以讓使用者在不使用 HTML 的情況下建立豐富的內容,例如 markdown 和 WYSIWYG 編輯器。

驗證輸入:驗證意味著實作規則,以防止使用者將資料發佈到不符合某些準則的表單中。例如,要求輸入使用者「姓氏」的輸入應具有驗證規則,只允許使用者提交包含英數字元的資料。驗證規則也可以設定為拒絕 Cross-site scripting 中常用的任何標記或字元,例如「<script>」標記。

清理資料:清理資料與驗證相似,但是它發生在資料發佈到 Web 伺服器之後、顯示給其他使用者之前。有幾種線上工具可以清除 HTML 並篩除惡意代碼插入。

採取 cookie 安全措施:Web 應用程式還可以為其 cookie 處理設定特殊規則,從而緩解透過 Cross-site scripting 攻擊進行的 cookie 盜竊。Cookie 可以綁定到特定的 IP 位址,以便 Cross-site scripting 攻擊者無法存取它們。此外,還可以乾脆建立規則來阻止 JavaScript 存取 Cookie。

設定 WAF 規則WAF 也可以設定為強制執行規則,以防止反射性 Cross-site scripting。這些 WAF 規則採用策略封鎖對伺服器的奇怪要求,包括 Cross-site scripting 攻擊。Cloudflare WAF 提供周全的安裝,可保護 Web 應用程式免受 Cross-site scripting 攻擊、DDoS 攻擊SQL 資料隱碼攻擊和其他常見威脅的侵害。