令和5年度 秋期 情報処理安全確保支援士試験 午後 問題 問1 XSS脆弱性の種類判別とWebアプリ対策

テクノロジセキュリティ技術

この問題は2023(R5)秋 情報処理安全確保支援士 午後に出題されたものです。出題時点の法令・制度に基づく内容のため、現行の内容と一致しない場合があります。

本ページの問題文・選択肢は、原本の体裁を Web 表示用に正規化しています(改行・記号・数式・図表参照の調整)。設問の趣旨および正解に影響する変更は加えていません。

学習ガイド

洋服のEC事業を営むQ社のWebアプリQで、無地Tシャツのレビューページに本来16件並ぶはずのレビューが2件しか表示されない、という異変からインシデント対応が始まります。開発リーダーがHTMLを確認すると不審なコードが見つかる、という実務に近い導入です。この記事では、混入したスクリプトがどの経路で保存・実行されたのかをHTMLとECMAScriptの記述から追い、格納型・反射型・DOM型のどれに当たるかを判別したうえで、レビュー投稿機能に即した対策を30字にまとめる筋道を確認します。

この記事で押さえる論点

  • 格納型・反射型・DOM型のXSSを発生経路の違いから見分けられる
  • HTMLとECMAScriptのソースから注入されたスクリプトの動作を読み解く
  • 出力時のエスケープなど、脆弱性の原因に即した恒久対策を選び取る
  • インシデント発生時に影響度と対応優先度を判断する視点を身に付ける

問題本文

問1 Webアプリケーションプログラムの開発に関する次の記述を読んで,設問に答えよ。

Q社は,洋服のEC事業を手掛ける従業員100名の会社である。WebアプリQというWebアプリケーションプログラムでECサイトを運営している。ECサイトのドメイン名は“□□□.co.jp”であり,利用者はWebアプリQにHTTPSでアクセスする。WebアプリQの開発と運用は,Q社開発部が行っている。今回,WebアプリQに,ECサイトの会員による商品レビュー機能を追加した。図1は,WebアプリQの主な機能である。

図1 WebアプリQの主な機能
図の説明テキスト
  1. 会員登録機能
    ECサイトの会員登録を行う。
  2. ログイン機能
    会員IDとパスワードで会員を認証する。ログインした会員には,セッションIDをcookieとして払い出す。
  3. カートへの商品の追加及び削除機能
    (省略)
  4. 商品の購入機能
    ログイン済み会員だけが利用できる。
    (省略)
  5. 商品レビュー機能
    商品レビューを投稿したり閲覧したりするページを提供する。商品レビューの投稿は,ログイン済み会員だけが利用できる。会員がレビューページに入力できる項目のうち,レビュータイトルとレビュー詳細の欄は自由記述が可能であり,それぞれ50字と300字の入力文字数制限を設けている。
  6. 会員プロフィール機能
    アイコン画像をアップロードして設定するためのページ(以下,会員プロフィール設定ページという)や,クレジットカード情報を登録するページを提供する。どちらのページもログイン済み会員だけが利用できる。アイコン画像のアップロードは,次をパラメータとして,“https://□□□.co.jp/user/upload”に対して行う。
    ・画像ファイル 注1)
    ・“https://□□□.co.jp/user/profile”にアクセスして払い出されたトークン 注2)
    パラメータのトークンが,“https://□□□.co.jp/user/profile”にアクセスして払い出されたものと一致したときは,アップロードが成功する。アップロードしたアイコン画像は,会員プロフィール設定ページや,レビューページに表示される。
    (省略)
    注1) パラメータ名は,“uploadfile”である。
    注2) パラメータ名は,“token”である。

ある日,会員から,無地Tシャツのレビューページ(以下,ページVという)に16件表示されるはずのレビューが2件しか表示されていないという問合せが寄せられた。開発部のリーダーであるNさんがページVを閲覧してみると,画面遷移上おかしな点はなく,図2が表示された。

図2 ページV
図の説明テキスト

商品レビュー 無地Tシャツの画面イメージ。
「レビューを投稿する」ボタンがあり、その下に「★ 4.9 16件のレビュー」と記載されている。
右上には無地Tシャツのイラストがある。
レビューのリストとして以下が表示されている。

  • (デフォルトのアイコン画像) 会員A
    2023年4月10日
    ★★★★★ Good
    Nice shirt!
  • (デフォルトのアイコン画像) 会員B
    2023年4月1日
    ★★★★☆ 形も素材も良い
    サイズ感がぴったりフィットして気に入っています(>_<)
    手触りも良く,値段を考えると良い商品です。
    リストの最後に「以上,全16件のレビュー」と記載されている。
    注記:(デフォルトのアイコン画像)は,会員がアイコン画像をアップロードしていない場合に表示される画像である。

WebアプリQのレビューページでは,次の項目がレビューの件数分表示されるはずである。

  • レビューを投稿した会員のアイコン画像
  • レビューを投稿した会員の表示名
  • レビューが投稿された日付
  • レビュー評価(1〜5個の★)
  • 会員が入力したレビュータイトル
  • 会員が入力したレビュー詳細

不審に思ったNさんはページVのHTMLを確認した。図3は,ページVのHTMLである。

図3 ページVのHTML
図の説明テキスト

ページVのHTMLコードスニペット。
(省略)

16件のレビュー
会員A
2023年4月10日
★★★★★
Good
Nice shirt!
会員B
2023年4月1日
★★★★☆
形も素材も良い
サイズ感がぴったりフィットして気に入っています(>_<)
手触りも良く,値段を考えると良い商品です。
以上,全16件のレビュー
(省略)

図3のHTMLを確認したNさんは,会員Aによって15件のレビューが投稿されていること,及びページVには長いスクリプトが埋め込まれていることに気付いた。Nさんは,ページVにアクセスしたときに生じる影響を調査するために,アクセスしたときにWebブラウザで実行されるスクリプトを抽出した。図4は,Nさんが抽出したスクリプトである。

図4 Nさんが抽出したスクリプト
図の説明テキスト

1: xhr = new XMLHttpRequest();
2: url1 = "https://□□□.co.jp/user/profile";
3: xhr.open("get", url1);
4: xhr.responseType = "document"; // レスポンスをテキストではなくDOMとして受信する。
5: xhr.send();
6: xhr.onload = function() { // 以降は,1回目のXMLHttpRequest(XHR)のレスポンスの受信に成功してから実行される。
7: page = xhr.response;
8: token = page.getElementById("token").value;
9: xhr2 = new XMLHttpRequest();
10: url2 = "https://□□□.co.jp/user/upload";
11: xhr2.open("post", url2);
12: form = new FormData();
13: cookie = document.cookie;
14: fname = "a.png";
15: ftype = "image/png";
16: file = new File([cookie], fname, {type: ftype});
// アップロードするファイルオブジェクト
// 第1引数: ファイルコンテンツ
// 第2引数: ファイル名
// 第3引数: MIMEタイプなどのオプション
17: form.append("uploadfile", file);
18: form.append("token", token);
19: xhr2.send(form);
20: }
注記: スクリプトの整形とコメントの追記は,Nさんが実施したものである。

Nさんは,会員Aの投稿はクロスサイトスクリプティング(XSS)脆弱性を悪用した攻撃を成立させるためのものであるという疑いをもった。NさんがWebアプリQを調べたところ,WebアプリQには,会員が入力したスクリプトが実行されてしまう脆弱性があることを確認した。加えて,WebアプリQがcookieにHttpOnly属性を付与していないこと及びアップロードされた画像ファイルの形式をチェックしていないことも確認した。

Q社は,必要な対策を施し,会員への必要な対応も行った。

設問と解答・解説

設問1

この攻撃で使われたXSS脆弱性について答えよ。

(1)

XSS脆弱性の種類を解答群の中から選び,記号で答えよ。

  1. DOM Based XSS
  2. 格納型XSS
  3. 反射型XSS

模範解答

選択肢イ: 格納型XSS

配点 6

解説

正解の根拠
本問の攻撃では、悪意のあるスクリプトがレビューとしてWebアプリQのサーバに投稿・保存されています。
他の会員が該当するレビューを閲覧した際に、サーバに保存されていたスクリプトがブラウザ上で実行される仕組みとなっています。
このように、攻撃者のスクリプトがサーバに格納された上で被害者のブラウザで実行されるXSSは、格納型XSSに該当します。

各選択肢の解説

  • ア(DOM Based XSS): スクリプトがサーバに送信されず、クライアント側のECMAScript等がDOMを操作する際の脆弱性を突く攻撃です。本問ではスクリプトでDOMを使用してはいますが、スクリプト自体がサーバに保存されているため不適切です。設問の講評にもある通り、DOMを使っているからといって「DOM Based XSS」と誤解しないよう注意が必要です。
  • イ(格納型XSS): 上述の理由により正解です。
  • ウ(反射型XSS): 悪意のあるスクリプトを含むリクエストをユーザーに送信させ、レスポンスとしてスクリプトがそのまま返され実行される攻撃です。サーバにスクリプトが保存されるわけではないため不適切です。

(2)

WebアプリQにおける対策を,30字以内で答えよ。

模範解答

レビュータイトルを出力する前にエスケープ処理を施す。

採点基準(配点 7点)

知識・理解度(内容)(4点)

  • 4: 「エスケープ処理(サニタイジング)」を施すことが明確に記述されている。
  • 2: 出力時の無害化や処理について言及しているが、具体性に欠ける。
  • 0: 対策として不適切、または無回答。

論理性(構造)(3点)

  • 3: 「出力する前に」などのタイミングや対象(レビュータイトル)が論理的に記述されている。
  • 1: 対策の内容は分かるが、対象やタイミングの記述が不足している。
  • 0: 論理的なつながりが不明確である。

解説

正解の根拠
XSS脆弱性への基本的な対策は、ユーザーが入力した文字列をWebページに出力する際、HTMLにおいて特別な意味を持つ文字(<>&"'など)を安全な文字列に置き換えるエスケープ処理(サニタイジング)を行うことです。
本問では、WebアプリQにおいて、入力されたレビュータイトルがそのまま出力されることでスクリプトが実行されてしまう脆弱性が存在しています。したがって、出力する前に適切なエスケープ処理を施すことが対策となります。

高得点のポイント

  • 対策としてエスケープ処理を行うことを明記する。
  • どのタイミングで(出力する前に)行うかを含める。

設問1(1)は,正答率は平均的であったが,スクリプトでDOMを使用していたことからか,“DOM Based XSS”と誤って解答する受験者が散見された。脆弱性の種類や埋め込まれた状況に応じた適切な対策を施すためにも,脆弱性は特徴や対策方法まで含めて,正確に理解してほしい。

設問2

図3について,入力文字数制限を超えるスクリプトが実行されるようにした方法を,50字以内で答えよ。

模範解答

HTMLがコメントアウトされ一つのスクリプトになるような投稿を複数回に分けて行った。

採点基準(配点 8点)

知識・理解度(内容)(5点)

  • 5: 複数回に分けて投稿したこと、およびHTMLがコメントアウトされる手法を用いたことが記述されている。
  • 3: 複数回に分けたこと、またはコメントアウトを利用したことのいずれか片方のみが記述されている。
  • 0: 入力文字数制限を回避した具体的な手法に触れられていない。

論理性(構造)(3点)

  • 3: 断片化された入力が結果として一つのスクリプトとして機能するロジックが分かりやすく記述されている。
  • 1: 手法は挙げられているが、それがどう一つのスクリプトになるかの因果関係がやや不明確。
  • 0: 文意が通らない。

解説

正解の根拠
図3の攻撃の痕跡を確認すると、攻撃者は入力文字数制限を回避するため、長いスクリプトを複数の投稿に分割しています。
さらに、各投稿の間に挿入される不要なHTMLタグを無効化するために、/**/ を用いて間のHTMLをコメントアウトしています。
これにより、ブラウザ上でレンダリングされた際に、分割された投稿が連結されて一つのスクリプトとして解釈・実行される仕組みになっています。
講評にあるように、「開発者ツールで入力制限を削除した」といった誤解をせず、残された痕跡から攻撃手法を正確に読み取ることが求められます。

高得点のポイント

  • 投稿を複数回に分けて行ったことを明記する。
  • 間のHTMLをコメントアウトし、一つのスクリプトとして実行させる工夫について言及する。

設問2は,正答率が平均的であった。HTMLやスクリプトをよく確認すれば解答ができたはずであるが,“開発者ツールで入力制限を削除してから投稿した”のように,確認が不足していると考えられる解答が一部に見られた。攻撃者の残した痕跡を注意深く確認し,攻撃者の行った攻撃の方法を正確に把握する能力を培ってほしい。

設問3

図4のスクリプトについて答えよ。

(1)

図4の6〜20行目の処理の内容を,60字以内で答えよ。

模範解答

XHRのレスポンスから取得したトークンとともに,アイコン画像としてセッションIDをアップロードする。

採点基準(配点 7点)

知識・理解度(内容)(4点)

  • 4: XHRのレスポンスからのトークン取得と、セッションIDのアップロードの両方が記述されている。
  • 2: トークンの取得、またはセッションIDのアップロードのいずれか片方のみが記述されている。
  • 0: 処理の内容が正しく把握できていない。

論理性(構造)(3点)

  • 3: トークンと共にセッションIDをアイコン画像としてアップロードする一連の処理の流れが論理的に記述されている。
  • 1: 処理の要素は含まれるが、前後の関係(トークンを用いてアップロードするなど)が不明瞭。
  • 0: 論理的な記述になっていない。

解説

正解の根拠
図4の6〜20行目のスクリプトの動作を読み解きます。
まず、XHR(XMLHttpRequest)を用いてマイページにアクセスし、レスポンスから画像アップロードに必要なトークンを取得しています(6〜11行目付近)。
その後、取得したトークンと、document.cookie から抽出したセッションIDを組み合わせ、アイコン画像のデータとして偽装してサーバにアップロードするリクエストを送信しています(12〜20行目付近)。

高得点のポイント

  • レスポンスからトークンを取得していることを記述する。
  • セッションIDアイコン画像としてアップロードしていることを明記する。

(2)

攻撃者は,図4のスクリプトによってアップロードされた情報をどのようにして取得できるか。取得する方法を,50字以内で答えよ。

模範解答

会員のアイコン画像をダウンロードして,そこからセッションIDの文字列を取り出す。

採点基準(配点 7点)

知識・理解度(内容)(4点)

  • 4: アイコン画像をダウンロードし、そこからセッションIDを取り出すことが明確に記述されている。
  • 2: 画像の取得のみ、あるいは情報を取り出すことのみが曖昧に記述されている。
  • 0: 情報の取得方法が不適切。

論理性(構造)(3点)

  • 3: ダウンロード(取得)から文字列の抽出までの手順が順序立てて記述されている。
  • 1: 手順の記述が不足しており、全体の流れが分かりにくい。
  • 0: 論理が破綻している。

解説

正解の根拠
設問の処理により、被害者のセッションIDは会員の「アイコン画像」としてWebアプリQのサーバにアップロード(保存)されています。
攻撃者は、このアップロードされた被害者のアイコン画像のURLにアクセスし、画像をダウンロード(取得)します。
ダウンロードした画像データを解析することで、攻撃者は被害者のセッションIDの文字列を取り出すことができます。

高得点のポイント

  • 攻撃者が被害者のアイコン画像をダウンロードすることを記述する。
  • ダウンロードしたデータからセッションIDの文字列を取り出すことを明記する。

(3)

攻撃者が(2)で取得した情報を使うことによってできることを,40字以内で答えよ。

模範解答

ページVにアクセスした会員になりすまして,WebアプリQの機能を使う。

採点基準(配点 7点)

知識・理解度(内容)(4点)

  • 4: セッションIDを用いて会員になりすますこと、およびWebアプリQの機能を利用することが記述されている。
  • 2: なりすますことのみ、あるいは機能の不正利用のみが記述されている。
  • 0: セッションハイジャックによる影響が正しく理解されていない。

論理性(構造)(3点)

  • 3: 取得した情報(セッションID)を利用してなりすましを行うという因果関係が明確である。
  • 1: なりすましの目的や対象(WebアプリQの機能)への言及が不十分。
  • 0: 論理的でない。

解説

正解の根拠
攻撃者が前問で取得した情報は、被害者のセッションIDです。
セッションIDを不正に取得した攻撃者は、自身のブラウザにそのセッションIDを設定することで、サーバ側からは正当な被害者として認識されます(セッションハイジャック)。
これにより、攻撃者は被害者になりすまして、WebアプリQの各種機能(商品の購入、登録情報の閲覧・変更など)を不正に利用することが可能になります。講評にある通り、ECサイトにおけるCookie漏えいの重大な影響となります。

高得点のポイント

  • 取得したセッションIDを用いて対象会員になりすますことを記述する。
  • なりすました結果、WebアプリQの機能を不正に使うことを明記する。

設問3(3)は,正答率が高かった。攻撃によって起きるかもしれない被害を推察して解答する必要がある問題であったが,ECサイトにおいてcookieが攻撃者に取得されることの影響について,よく理解されていた。

設問4

仮に,攻撃者が用意したドメインのサイトに図4と同じスクリプトを含むHTMLを準備し,そのサイトにWebアプリQのログイン済み会員がアクセスしたとしても,Webブラウザの仕組みによって攻撃は成功しない。この仕組みを,40字以内で答えよ。

模範解答

スクリプトから別ドメインのURLに対してcookieが送られない仕組み

採点基準(配点 8点)

知識・理解度(内容)(5点)

  • 5: 同一オリジンポリシー(またはそれに基づく挙動)により、別ドメインへCookieが送信されない仕組みであることが記述されている。
  • 3: 別ドメインからのアクセス制限について言及しているが、Cookieの送信制御についての記述が曖昧。
  • 0: Webブラウザのセキュリティ機構について誤った理解をしている。

論理性(構造)(3点)

  • 3: スクリプトと別ドメイン、およびCookieの関係性が論理的に記述されている。
  • 1: 要素の繋がりが弱く、なぜ攻撃が成功しないのかのロジックが不十分。
  • 0: 論理が破綻している。

解説

正解の根拠
Webブラウザには、セキュリティ上の重要な機構として同一オリジンポリシー(Same-Origin Policy)が実装されています。
この仕組みにより、あるオリジン(ドメイン、スキーム、ポート番号の組み合わせ)から読み込まれたスクリプトは、異なるオリジン向けのCookieを含めてリクエストを送信したりすることが制限されます。
したがって、攻撃者が用意した別ドメインのサイト上で図4のスクリプトが実行されても、WebブラウザはWebアプリQ(別ドメイン)のCookie(セッションID)を送信させないため、攻撃は成功しません。

高得点のポイント

  • 別ドメインのURLへのアクセスであることを明記する。
  • そのアクセスにおいてCookieが送られない(制限される)仕組みであることを記述する。