[IS] Cross-Site Scripting (XSS)
Cross-Site Scripting (XSS)
Cross-site scripting (XSS) 是一種透過 <script>
來讓瀏覽器在未經過濾惡意程式碼的情況下將這些惡意程式執行在瀏覽器上,通常會透過網址來執行 JavaScript 或把 <script>
透過 input 存在 database,其他使用者讀取時則會載入惡意程式碼。
舉例來說:當受害者進入網頁時,執行惡意的 JavaScript 程式碼來 讀取使用者的 Cookies,接著將竊取來的 credentials (cookie) 傳送到攻擊者的伺服器。
常見的 XSS 類型可以分成下面幾類:
Self XSS or Reflected XSS / DOM-based
- 透過使用者所發出的請求(例如,網址上),在伺服器回應後,將有害的內容顯示在頁面上
http://legitamite-bank.com/index.php?user=&script>here is some bad code!</script>
- 需要用到社交工程(social engineering),常見情境像是攻擊者會寄送惡意連結給受害人,受害人點開連結後會進入到惡意的網頁,該網頁中的惡意程式會在受害者的瀏覽器中執行,以此竊取機密資訊等。
Stored or Persistent
- 將有害的內容存在伺服器上的資料庫、檔案系統內等,在使用者稍後瀏覽頁面時呈現。舉例來說,留言板、塗鴉牆或部落格的內容。
- 不需要使用到社交工程。
防範 XSS
要防範 XSS 最基本的作法對於所有不信任來源的 input 都要以 encode 後的方式呈現在瀏覽器上,而不是直接讓他執行:
- 避免讓使用者在 input 中可以直接輸入 HTML
- 驗證:使用者輸入的內容後,才把資料存入資料庫,例如,過濾掉
<script>
這類到標籤 - 消毒:在將資料庫的內容呈現給使用者前,先對這些內容進行消毒(sanitize),例如將內容中的 HTML Body 和 attribute 內的 HTML Entities 都進行編碼
範例程式碼
任何會顯示使用者所提供資料的頁面,例如 message boards 或 comments。在 input 欄位內輸入 <script>alert('my javascript here')</script>
看看是否有被執行。
參考
- excess-xss
- OWASP:包含各種資訊安全描述
- Cross-site Scripting @ CloudFlare
- JavaScript Security Issues and Best Practices @ Medium