クロスサイトスクリプティングとは
クロスサイトスクリプティング(XSS)とは、動的にWebページを生成するWebサイト(SNS、ブログ、掲示板など)の脆弱性を利用し、悪意のあるJavaScriptなどのスクリプトをページ内に埋め込む攻撃です。他のユーザーがそのページにアクセスした際、埋め込まれた不正なスクリプトが閲覧者のブラウザ上で勝手に実行されてしまいます。これにより、閲覧しているユーザーのクッキー情報(セッションID)が盗まれてアカウントが乗っ取られたり、画面の表示を書き換えられて別の偽サイトに誘導されたりする被害が発生します。
具体例
掲示板のコメント投稿欄に、普通の文章のふりをして「閲覧者のCookie情報を攻撃者に送信する」という内容のJavaScriptコードを投稿します。その投稿を別のユーザーがブラウザで表示した瞬間、裏でコードが実行され、セッション情報が盗まれてしまいます。
[攻撃者] --(不正スクリプトを投稿)--> [掲示板サーバー]\n | (そのまま保存)\n[一般ユーザー] --(スレッドを閲覧)--> [ブラウザがスクリプトを実行] --> [Cookie情報が盗まれる]
もう少し詳しく
クロスサイトスクリプティング(XSS)は、攻撃対象がWebサーバーではなく、「そのWebサイトを利用している一般のユーザー(クライアント端末のブラウザ)」であるという点が大きな特徴です。Webページに悪意あるHTMLタグやJavaScriptプログラム(スクリプト)が意図せず埋め込まれ、それを閲覧したユーザーのブラウザ上で自動的に実行されてしまいます。XSSは、その伝播方法によって大きく以下の3つのタイプに分けられます。
・格納型(蓄積型 / Stored XSS): 攻撃者がWebサーバー(掲示板、ブログ、SNSのプロフィール欄など)のデータベースに不正なスクリプトを書き込んで保存させます。そのページを訪れた他の不特定多数のユーザーがページを読み込むたびに、ブラウザがスクリプトを実行し、被害を受けます。被害の持続性と範囲が非常に広い危険な手法です。
・反射型(Reflected XSS): メールやSNSのリンクに、スクリプトを含んだパラメータを仕込んでターゲットに踏ませます。リンクをクリックすると、Webサーバーは送られてきたパラメータ(スクリプト)をそのまま「検索結果画面」や「エラー画面」などの応答ページに反射して埋め込み、踏んだ本人のブラウザ上でスクリプトが実行されます。
・DOM-based XSS: サーバーからのレスポンスを介さず、クライアント側(ブラウザ上)で実行されるJavaScript自体が、不適切に入力されたパラメータをHTMLとして描画するバグを突いて実行される手法です。
XSSによって最も狙われやすいのが、Cookie(クッキー)に保存されたセッションIDの窃盗です。JavaScriptの「document.cookie」というプロパティを読み取って外部の攻撃サーバーへ送信されると、攻撃者はそのセッションIDを使って「本人がログイン中である」と偽るセッションハイジャックを実行し、アカウントを完全に乗っ取ることができます。
試験でのポイント
試験対策としては、まず「利用者のブラウザ上で悪意あるスクリプトを実行させる」という仕組みそのものの定義を確実に理解することです。そして、何よりも出題されるのが、XSS脆弱性を防止するための「サニタイジング(エスケープ処理)」に関する問題です。
・HTMLサニタイジング: Webアプリケーションで動的にHTMLを出力する際、HTMLタグの開始や終了を意味する特殊記号である「<」「>」「&」「"」「'」などを、ブラウザにプログラムとして認識させないように、文字の実体参照(例:「<」「>」「&」「"」「'」)に置換して無害化(エスケープ)します。試験では、このエスケープ処理が最も根本的な解決策である点を選択肢から選び出せるようになっておく必要があります。
・Cookieのセキュア属性とHttpOnly属性: セッション情報の盗難を防ぐための設定です。特に「HttpOnly」属性を付与することで、ブラウザ上のJavaScriptからクッキーデータにアクセスすることを禁止できます。これにより、万が一XSS脆弱性があってスクリプトが実行されても、CookieのセッションIDは盗まれないように保護されます。これも実務的な対策問題として頻出です。
関連する用語
Webブラウザとサーバー間でセッション情報を一時保管する仕組み「Cookie」、ログイン状態を悪用して第三者に不正な要求を送る「CSRF」、Webアプリ層への悪意あるリクエストを遮断するセキュリティツール「WAF」などがあります。