Cross-site Scripting (XSS) にはなぜ「cross-site」という表現が使われるのか?とふと疑問に思い、この背景を含め、XSSの一般的な定義について改めて調査した。
定義
CWE-79(参考:JVNによる翻訳)では以下のような説明(ざっくりと要約している)となっている。
- 信頼できないデータがWebアプリケーションに入力され、それが適切に無害化されずに他者に提供されるWebページに出力されることで、他者のブラウザ上で悪意のあるスクリプトが正規のドメインのコンテキストで実行されてしまうこと。
分類
CWE-79ではXSSを以下の3つに分類している。
- Type 1: Reflected (Non-Persistent) XSS
- HTTPリクエストのデータがそのままHTTPレスポンスに反映されて引き起こされるもの。典型的にはパラメータ付きURLがメール等で配布されることで被害者に渡る。
- Type 2: Stored (Persistent) XSS
- 悪意のあるデータがDBやログ等に保存され、それが被害者に表示されることで引き起こされるもの。
- Type 0: DOM Based XSS
- クライアントスクリプトがユーザー入力をWebページ(のDOM)に出力する際に発生するもの。(データがブラウザの外に出ない。)
一方でOWASP(参考:Type of XSS)では、上記の3分類は重複があるとして脆弱性の所在に基づいた以下の分類との組み合わせ(Reflected or Stored x Server or Client)とすることを提案している。
- Server XSS
- サーバーサイドの脆弱性によりHTTPレスポンスにスクリプトが埋め込まれる。
- Client XSS
- クライアントサイドの脆弱性によりDOM更新時に不安全なJavaScript呼び出しが行われる。
- DOM based XSSはこの一種(データソースがサーバーではなくDOMとなるパターン)となる。
例えば、Java (Servlet) で作られた掲示板システムでDBに保存されたユーザーの投稿をHTMLに出力する際に無害化がされていなかった、というケースはStored Server XSSに該当する。
Cross-Siteと呼ばれる背景
いくつかのサイトに背景に関する説明があったが、いずれも以下のような内容であった。
- 当初は攻撃元サイトと攻撃先サイトの間でのcross-originアクセスを悪用した攻撃のことを指していたが、次第にブラウザに対するインジェクション攻撃として定義が拡張されていった。
参考
(蛇足)関連用語
XSSに似た用語としてHTML Injectionがしばしば登場するが、これには明確な定義は存在しないようである。CWEではHTML InjectionはStored XSSと同義とされている一方で、OWASP(参考:Injection Theory)ではXSS全体がHTML Injectionの一種となっている。