クロスサイトスクリプティング(XSS)【情報処理安全確保支援士講座】

今回は、情報処理安全確保支援士の試験で問われるクロスサイトスクリプティングについて解説します。


クロスサイトスクリプティング

クロスサイトスクリプティング(XSS:Cross-site Scripting)は、ユーザの入力を処理するためにWeb上で動くJavaScriptの脆弱性を突いた攻撃で、ユーザのPC上で不正なスクリプトを実行します。具体的な内容は下記の通りです。
- 個人情報の漏えい
- クライアントPC上のファイル破壊
- バックドアを仕掛けられ他の攻撃の足掛かりになる
クロスサイトスクリプティングの脆弱性
クロスサイトスクリプティングの脆弱性は、CWE(Common Weakness Enumeration)により3つに分類されています。
反射型XSS(非持続的)
反射型XSSは、ユーザからのリクエストに含まれるスクリプトに相当する文字列を、レスポンスとしてWebページ内に実行可能なスクリプトとして出力してしまう形式の脆弱性です。
スクリプトがリクエストの送信者に帰るため、反射型と呼ばれます。
格納型XSS(持続的)
格納型XSSは、ユーザからのリクエストに含まれるスクリプトに相当する文字列を、Webアプリケーションの内部に永続的に保存し、当該文字列をWebページに実行可能なスクリプトとして出力する形式の脆弱性です。
この脆弱性があるWebサイトをユーザが閲覧するたびに実行されることから格納型と呼ばれます。
DOM-based XSS
DOM-based XSSは、Webページに含まれる正規のスクリプトにより動的にWebページを操作した結果、意図しないスクリプトをWebページに出力する形式の脆弱性です。

XSS脆弱性有無の確認方法
以降は反射型XSSを前提に解説します。
名前・住所・電話番号などを入力するフォームにXSSの脆弱性がある場合とない場合の挙動の違いを確認しましょう。
標準仕様として、下記のように入力内容がそのまま確認画面に表示されるフォームにて、アラート文を入れる例を考えます。

脆弱性対策がされているフォーム

入力した文字列は、そのまま文字列として処理され画面に表示されます。
もしくは、不正な文字列と判断され、別の文字に置き換えて表示されます。
脆弱性対策がされていないフォーム

入力されたアラート文がそのまま表示されます。
XSSの脆弱性があるサイトでは、入力データの確認が正確に行われていないため、悪意のあるスクリプトを入力すればクライアント環境にてさまざまな処理が実行されてしまいます。

クロスサイトスクリプティングの流れ

具体的なクロスサイトスクリプティングの流れを確認しておきましょう。
- 攻撃者が入力フォームなどにスクリプト付のリンクを含む内容を入力してWebサイトに罠を仕掛ける
- 訪問者が該当するWebサイトに訪問する
- リンクをクリックしてスクリプトが実行されると、悪意のあるサイトに遷移して不正なスクリプトが実行される
- マルウェア感染やファイル破壊などの被害が起きる
クロスサイトスクリプティングの対策
反射型XSSおよび格納型XSSは、下記の方法で対策できます。
- HTTPレスポンスヘッダのContent-Typeフィールドに文字コードを指定する
- タグの属性値をダブルクォートで囲む
- タグの属性値に含まれるメタキャラクタのエスケープ処理を行う
HTTPレスポンスヘッダのContent-Typeフィールドに文字コードを指定する
HTTPレスポンスヘッダのContent-Typeフィールドには、UTF-8などの文字コードを指定できます。文字コードを省略した場合はブラウザが独自に文字コードを推定して表示処理を行います。

例えば、UTF-7だと「」を「+AD4-」と表現できます。したがって、UTF-7が指定されていたり文字コードが明示されていないと、攻撃者はUTF-7にエンコードされたスクリプトを混入可能です。
逆に、文字コードを指定すればこのような挙動を悪用した攻撃を防げます。
タグの属性値をダブルクォートで囲む
タグの属性値をダブルクォートで囲むことで、属性値を一連の文字列として扱えます。逆に、ダブルクォートで囲われていないと属性値にスペースが含まれただけで問題が発生するリスクがあります。
タグの属性値に含まれるメタキャラクタのエスケープ処理を行う
タグの属性値に含まれるメタキャラクタ(「」「&」など)のエスケープ処理を行うことでも、入力データを無効化できます。

エスケープ処理の例を確認しておきましょう。
- & → &
- < → <
- > → >
- " → "
- ' → '
HTTPレスポンスヘッダによるXSS対策
Webサーバ側で下記のようなレスポンスヘッダを返すことで、XSSによる攻撃を防いだり制限したりが可能です。
| レスポンスヘッダ | 挙動 |
| X-XSS-Protection | 反射型XSSを検知したときに、ページの読み込みを停止する |
| Content-Security-Policy | スクリプトの読み込みを許可するドメインをポリシとして指定することで、悪意のあるスクリプトの読み込みを防ぐ |
HttpOnly属性でCookieの漏えい対策
発行するCookieにHttpOnly属性を設定しておくと、Cookieの適用範囲をHTTP/HTTPS通信に限定できます。したがって、ブラウザなどで実行されたスクリプトが”document.cookie”を用いてアクセスすることを禁止できます。
結果的に、XSSによるCookieの盗難防止が可能です。
HttpOnly属性に対応していないブラウザとして、古いブラウザが挙げられます。また、WebサーバでTRACEメソッドが有効かつXSSの脆弱性があると、クロスサイトトレーシング(XST)と呼ばれる攻撃でCookie情報が取得される可能性があります。

DOM-based XSSの対策
DOM-based XSSは、”Create Element”や、”CreateTextNode”など、DOM操作用のメソッドやプロパティを用いてWebページを構築する必要があります。
仕様上、”documentWrite”や”innerHTML”などのメソッドやプロパティが必要な場合は、文脈に応じてエスケープ処理を組み込みます。
また、DOM-Based XSSの脆弱性は独自開発されたWebページに限らず、jQueryをはじめとしたJavaScriptライブラリの古いバージョンにも存在します。
したがって、JavaScriptのバージョンを最新にする点も重要です。
クロスサイトスクリプティング・例題
実際に例題を解いて問題に慣れていきましょう。
問
ア:WebサーバにSNMPエージェントを常駐稼働させ,Webサーバの負荷状態を監視する。
イ:WebサーバのOSのセキュリティパッチについて,常に最新のものを適用する。
ウ:Webサイトへのデータ入力について,許容範囲を超えた大きさのデータの書込みを禁止する。
エ:Webサイトへの入力データを表示するときに,HTMLで特別な意味をもつ文字のエスケープ処理を行う。
(ログイン後回答すると、ここに前回の正誤情報が表示されます)
クロスサイトスクリプティング・まとめ
この記事のまとめ
- XSSの概要
- XSSによる脆弱性
- XSSの対策
クロスサイトスクリプティングは、特に午後(科目B)試験で問われる内容です。具体的な攻撃の流れだけでなく、対策方法も押さえておきましょう。
次回はSQLインジェクションについて学習します。








ディスカッション
コメント一覧
まだ、コメントがありません