情報処理安全確保支援士 2024年 春期 午後 問03
Webセキュリティに関する次の記述を読んで、設問に答えよ。
D社は、従業員1,000名の小売業である。自社のホームページやECサイトなどのWebサイトについては、Webアプリケーションプログラム(以下、Webアプリという)に対する診断(以下、Webアプリ診断という)を専門会社のZ社に委託して実施している。Webアプリ診断は、Webサイトのリリース前だけではなく、リリース後も定期的に実施している。Z社のWebアプリ診断は、脆弱性診断ツールによるスキャンだけではなく、手動による高度な分析も行う。
〔新たなWebサイトの構築〕
D社では、新たにECサイトX(以下、サイトXという)と商品企画サイトY(以下、サイトYという)をW社が提供するクラウドサービス(以下、クラウドWという)上に構築することになった。
サイトXでは、D社が取り扱う商品をインターネットを介して会員に販売する予定である。取引は毎月10,000件ほどを見込んでいる。サイトYでは、サイトXで販売する新商品の企画・開発を顧客参加型で行う。サイトXとサイトYは、いずれもWebサーバとデータベースサーバ(以下、DBサーバという)で構成する。WebサーバについてはクラウドWの仮想Webサーバサービスを利用し、DBサーバについてはクラウドWのリレーショナルデータベースサービスを利用する。サイトXとサイトYはいずれも、コンテンツマネジメントシステム(以下、CMSという)を使って構築される。サイトXとサイトYにはいずれも、Webアプリ、HTMLによる静的コンテンツ、DBサーバに格納したデータを使った動的コンテンツなどを用意する。
D社は、V大学と新商品開発の共同研究を行っている。新商品開発の共同研究では、V大学が運用する情報交換サイト(以下、サイトPという)を利用している。サイトYは、サイトPで取り扱っている情報などを表示する。
D社は、Webサイト構築に関連するデータやドキュメントの保存場所として、クラウドWのストレージサービス(以下、ストレージWという)を利用する。
D社は、サイトX及びサイトYの設計書を作成した。設計書のうち、サイトX、サイトY及びサイトPのネットワーク構成を図1に、サーバやサービスの説明を図2に示す。


〔サイトX〕
サイトXには、会員用の利用者アカウントとD社管理者用の利用者アカウントがある。サイトXのログインセッション管理は、cookieパラメータのSESSIONIDで行う。SESSIONIDには、値とSecure属性だけがセットされる。なお、サーバ側のセッションの有効期間は24時間である。設計書のうち、サイトXの機能一覧を表1に示す。
サイト管理機能は、D社の内部ネットワーク以外からも利用する可能性があり、サイトXでは、接続元の制限は行わない。
サイトXとサイトYの構築は順調に進み、D社はリリース前のWebアプリ診断をZ社に委託した。Z社は、サイトXとサイトYそれぞれに対してWebアプリ診断を実施した。
〔サイトXに対するWebアプリ診断〕
サイトXに対するWebアプリ診断では、次の三つの脆弱性が検出された。
・クロスサイトスクリプティング(以下、XSSという)
・クロスサイトリクエストフォージェリ(以下、CSRFという)
・認可制御の不備
〔XSSについて〕
Z社がXSSを検出した経緯は、次のとおりであった。
(1) 問合せ機能で、脆弱性診断ツールによるリクエストとレスポンスを確認した。このときのリクエストとレスポンスは、図3のとおりであった。
(2) 図3中のレスポンスボディには、問合せ機能で入力した値は出力されていない。しかし、Z社は、①設計書を調査した上で手動による分析を行い、図3中のリクエスト内のスクリプトが別の機能の画面に出力されることを確認した。
Z社は、②攻撃者がこのXSSを悪用してサイトX内の全会員の利用者情報を取得する可能性があると説明した。
〔CSRFについて〕
Z社がCSRFを検出した経緯は、次のとおりであった。
(1) 会員機能(編集)において、図4に示すリクエストを送ってその応答を確認した。リクエストは正常に処理された。

(2) リクエスト内のメッセージボディの一部を変更して送り、その応答を確認した。リクエスト内のメッセージボディと応答は表2のとおりであった。

(3) Z社は、手順1、2の応答が“エラー”であることから一定のCSRF対策ができているが、手順3の応答が“正常に処理”であることから③利用者に被害を与える可能性があると判断した。
Z社は、対策には二つの方法があることを説明した。
・csrf_tokenの処理の修正
・cookieへのSameSite属性の追加
サイトXの構成次第では、SameSite属性をcookieに付与することも有効な対策となり得る。SameSite属性は、Strict、Lax、Noneの三つの値のうちのいずれかを取る。サイトXにログインした利用者のWebブラウザにおいて、サイトX内で遷移する場合と外部WebサイトからサイトXに遷移する場合では、SameSite属性の値によってサイトXのcookie送信の有無が表3のように異なる。
〔認可制御の不備について〕
Z社が認可制御の不備を検出した経緯は、次のとおりであった。
(1) Z社は、利用者α、利用者βという二つの利用者アカウントを用いて、注文履歴を閲覧した際のリクエストを確認した。注文履歴を閲覧した際のリクエストを図5及び図6に示す。


(2) 図5のリクエストのパラメータorder-codeの値を図6中の値に改変してリクエストを送った。
(3) 利用者αが、本来は閲覧できないはずの利用者βの注文履歴を閲覧できるという攻撃が成功することを確認した。
(4) さらに、ある利用者がほかの利用者が注文した際のorder-codeを知らなくても、④ある攻撃手法を用いれば攻撃が成功することを確認した。
Z社は、⑤サイトXのWebアプリに追加すべき処理を説明した。
〔サイトYに対するWebアプリ診断〕
サイトYに対するWebアプリ診断では、次の脆弱性が検出された。
・サーバサイドリクエストフォージェリ(以下、SSRFという)
〔SSRFについて〕
Z社がSSRFを検出した経緯は、次のとおりであった。
(1) サイトPの新着情報を取得する際に、利用者のWebブラウザがWebサーバYに送るリクエストを確認したところ、図7のとおりであった。

(2) ⑥図7のリクエストのパラメータの値をWebサーバYのCMSの管理ログイン画面のURLに変更することで、その画面にアクセスできるが、ログインはできないことを確認した。
(3) ⑦図7のリクエストのパラメータの値を別のURLに変更するという方法(以下、方法Fという)でSSRFを悪用して、クレデンシャル情報を取得し、ストレージWから情報を盗み出すことができることを確認した。
(4) IMDSにアクセスする方式を方式1から方式2に変更すると、方法Fではクレデンシャル情報を取得できないので、ストレージWから情報を盗み出すことができない。しかし、図7のリクエストのパラメータの値を変更することで、WebサーバYから送られるリクエストに任意のメソッドの指定及び任意のヘッダの追加ができる方法(以下、方法Gという)がある。方法Gを用いれば、方式2に変更しても、⑧クレデンシャル情報を取得し、ストレージWから情報を盗み出すことができることを確認した。
Z社は、クラウドW上のネットワークでのアクセス制御の設定、及び⑨サイトYのWebアプリに追加すべき処理を提案した。
リリース前の脆弱性診断で検出された脆弱性の対策が全て完了し、サイトXとサイトYは稼働を開始した。
設問1:〔XSSについて〕について答えよ。
問題文を見る模範解答
9
解説
解答の論理構成
-
- 【問題文】「問合せ機能で、脆弱性診断ツールによるリクエストとレスポンスを確認した。」
- リクエストのパラメータnameに "><script>alert(1)</script>< がURLエンコードされたまま送信されています。
-
レスポンスには当該値が出力されていませんが、Z社は「設計書を調査した上で手動による分析を行い、図3中のリクエスト内のスクリプトが別の機能の画面に出力されることを確認」しました。
-
表1を確認すると、問合せ情報を後から閲覧できる管理用画面は項番9「問合せ管理機能」です。
- 表1項番9「問合せ管理機能」:
「問合せ機能で入力された問合せ情報が閲覧できる。」
- 表1項番9「問合せ管理機能」:
-
すなわち、問合せ機能で登録した値が表示される画面は管理者向けの「問合せ管理機能」であり、ここでスクリプトが実行されることでXSSが成立します。
-
以上より、下線①で問われている “図3中のリクエスト内のスクリプトが出力される機能” の詳細機能に対する項番は「9」となります。
誤りやすいポイント
- 問合せ機能(項番5)と問合せ管理機能(項番9)の役割を混同しやすい。入力画面ではなく“閲覧”画面にXSSが現れる点に注意。
- 「会員機能(編集)」や「サイト管理機能」と誤って関連付けるケースがあるが、図3のリクエスト内容(subject_id, name, telなど)は問合せ情報特有の項目。
- “別の機能に出力される” という記述を見落とし、同一画面内での反射型XSSと早合点しやすい。
FAQ
Q: 反射型XSSと永続型XSSのどちらに該当しますか?
A: 問合せ情報がDBに保存され、管理画面で後日表示されるためユーザが異なります。保存→表示の流れなので永続型XSSに分類できます。
A: 問合せ情報がDBに保存され、管理画面で後日表示されるためユーザが異なります。保存→表示の流れなので永続型XSSに分類できます。
Q: なぜサイト管理画面が外部からもアクセス可能なのにIP制限を設けなかったのでしょうか?
A: 問題文では「サイトXでは、接続元の制限は行わない」と設計されています。運用要件で多地点からのアクセスを許容した結果、IP制限を採れなかったと推測されます。
A: 問題文では「サイトXでは、接続元の制限は行わない」と設計されています。運用要件で多地点からのアクセスを許容した結果、IP制限を採れなかったと推測されます。
Q: XSSを根本的に防ぐには何を実装すべきですか?
A: サーバ側でのエスケープ(HTMLエンコード)と入力値検証の徹底、HTTPヘッダContent-Security-Policyの導入が有効です。
A: サーバ側でのエスケープ(HTMLエンコード)と入力値検証の徹底、HTTPヘッダContent-Security-Policyの導入が有効です。
関連キーワード: XSS, 永続型、入力値検証、HTMLエスケープ、コンテンツセキュリティポリシー
設問1:〔XSSについて〕について答えよ。
問題文を見る(2)本文中の下線②について、攻撃者はどのような手順で利用者情報を取得するか。具体的に答えよ。
模範解答
攻撃者がわなリンクを用意し、管理者にそのリンクを踏ませることで管理者権限のcookieを攻撃者のWebサイトに送信させ、その値を読み取って利用することで管理者としてサイトXにアクセスし、利用者情報を取得する。
解説
解答の論理構成
-
攻撃者が入力できる画面
-
スクリプトの保存と表示場所
- 手順(2)でZ社は「設計書を調査した上で手動による分析を行い、図3中のリクエスト内のスクリプトが別の機能の画面に出力されることを確認」した。
- 別の機能とは、同じ表1の項番9「問合せ管理機能」である。これは「サイト管理機能(ログイン後)」に含まれ、D社管理者が閲覧する。
-
攻撃対象となる利用者(D社管理者)の権限
- サイトXには「D社管理者用の利用者アカウント」があり、管理者は表1の項番8「会員管理機能(閲覧、変更、削除)」など全会員情報を扱える高権限を持つ。
-
スクリプト実行時のセッション利用
- サイトXのログインセッションはcookieのSESSIONIDで管理され、「値とSecure属性だけがセットされる」。したがってJavaScriptからdocument.cookieで読める。
- 管理者が「問合せ管理機能」を開くと、保存されたスクリプトが管理者のブラウザで実行され、同ブラウザに存在する管理者用SESSIONIDを取得できる。
-
全会員情報の取得フロー
① 攻撃者は問合せ機能でXSSペイロードを登録(図3)。
② 管理者が問合せ管理機能を開く ⇒ ペイロードが実行。
③ ペイロードはSESSIONIDを読み取り、攻撃者サーバへ送信。
④ 攻撃者は受け取ったSESSIONIDを自分のブラウザに設定し、管理者セッションとしてログイン状態を再現。
⑤ 攻撃者は表1の「会員管理機能(閲覧、変更、削除)」にアクセスし、サイトX内の全会員の利用者情報をダウンロードする。 -
以上により、下線②「攻撃者がこのXSSを悪用してサイトX内の全会員の利用者情報を取得する」手順が成立する。
誤りやすいポイント
- 反射型と誤認し、管理者がリンクを踏む必要があると考えてしまう。実際は問合せ内容が保存されるため「保存型XSS」。
- SESSIONIDにSecure属性が付いているだけでJavaScriptから読めないと誤解する(必要なのはHttpOnly属性)。
- スクリプトが直接利用者情報をAPI呼び出しで抜き取ると考え、cookie窃取のステップを抜かす。攻撃の主眼は管理者権限の奪取。
- 「サイト管理機能は、D社の内部ネットワーク以外からも利用する可能性があり」とあるため、攻撃者が直接ログインできると誤解するが、パスワードは不明なのでcookie取得が必要。
FAQ
Q: Secure属性が付いているcookieはJavaScriptから読めないのでは?
A: 読み取り可否を制御するのはHttpOnly属性です。問題文には「Secure属性だけがセットされる」とあるため、スクリプトからSESSIONIDを取得できます。
A: 読み取り可否を制御するのはHttpOnly属性です。問題文には「Secure属性だけがセットされる」とあるため、スクリプトからSESSIONIDを取得できます。
Q: 管理者が問合せ管理機能を開かないと攻撃は成立しないのでは?
A: はい。保存型XSSの典型で、管理者が対象ページを閲覧したタイミングでスクリプトが実行されます。大半の運用で管理者は新規問合せを確認するため、実行機会は高いと想定できます。
A: はい。保存型XSSの典型で、管理者が対象ページを閲覧したタイミングでスクリプトが実行されます。大半の運用で管理者は新規問合せを確認するため、実行機会は高いと想定できます。
Q: スクリプトが直接APIを叩いて情報を抜く方法は取れないのか?
A: AjaxでAPIを呼び出す方法でも可能ですが、今回の解答要求は「cookieを盗み管理者としてログインして会員情報を取得する」手順を想定しています。
A: AjaxでAPIを呼び出す方法でも可能ですが、今回の解答要求は「cookieを盗み管理者としてログインして会員情報を取得する」手順を想定しています。
関連キーワード: 保存型XSS, セッションハイジャック、Secure属性、HttpOnly属性、権限昇格
設問2:〔CSRFについて〕について答えよ。
問題文を見る(1)本文中の下線③について、被害を与える攻撃の手順を、具体的に答えよ。
模範解答
攻撃者が自らのアカウントで取得したcsrf_tokenと一緒に利用者情報をサイトXに送るように構成したわなフォームに、詐欺メールなどで利用者を誘導し、利用者情報を変更させる。
解説
解答の導き方
設問は下線③「利用者に被害を与える可能性がある」とある箇所について、具体的な攻撃手順を記述することを求めています。まず本文のどの記述が攻撃を可能にしているかを順に確認します。
-
表2の挙動から脆弱性の本質を把握する
表2では、手順1(csrf_tokenが空)と手順2(csrf_tokenがない)は「エラー」となりますが、手順3では「csrf_token=(異なる利用者アカウントで取得したcsrf_tokenの値)」を送ると「正常に処理」となっています。ここから「サーバ側はcsrf_tokenが存在することや形式を確認しているかもしれないが、送信されたcsrf_tokenがそのリクエストの送信者(=セッション)に紐づく正しい値かどうかを検証していない」ことが読み取れます。つまり、別アカウントで取得したcsrf_tokenでも受け入れてしまう設計上の欠陥があります。 -
セッションCookieの状態を確認する
本文に「SESSIONIDには、値とSecure属性だけがセットされる。」とあり、SameSite属性が設定されていないことが明示されています(つまり現状ではSameSiteによるクロスサイト送信の制限が働いていない)。そのため、攻撃者が用意した外部ページから被害者のブラウザが送信するリクエストには被害者のSESSIONIDが含まれてサーバはそのリクエストを被害者のセッションからのものと扱います。 -
これらをつなげて攻撃手順を構成する
上の2点を合わせると、攻撃者は「自分で取得したcsrf_token」をフォーム内に組み込み、被害者にそのフォームを送らせれば(被害者のブラウザは自動的に被害者のSESSIONIDを送る)、サーバはcsrf_tokenとSESSIONIDの組み合わせを正しく突き合わせずに処理を行ってしまい、被害者の利用者情報を変更できる、という攻撃が成立します。
具体的な攻撃手順(順を追って)
1)攻撃者が自分の利用者アカウントでサイトXにログインし、編集画面等から有効なcsrf_tokenを取得する(図4のリクエストにあるように編集用POSTにはcsrf_tokenが含まれる)。
2)攻撃者は以下のような外部ページ(攻撃ページ)を用意する。攻撃ページには、送信先を /shop/editmemberにするHTMLフォームを置き、フォームの隠し項目に取得した攻撃者のcsrf_tokenをセットし、変更したい利用者情報(例えばmailや氏名)を設定しておく。フォームはページ読み込み時に自動送信されるようにする。
3)攻撃者は詐欺メールなどで複数の会員をその攻撃ページに誘導する。
4)被害者が攻撃ページを開くと、ブラウザが自動的にPOSTを送信する。ブラウザは被害者のSESSIONIDをCookieヘッダに付与して送る(本文にあるようにSESSIONIDはSameSite未設定の状態)。POSTのメッセージボディには攻撃者が埋めたcsrf_tokenが含まれる。
5)サーバは受信したcsrf_tokenを検証するが、表2の挙動が示す通り「別アカウントで取得したcsrf_tokenでも正常に処理」してしまうため、被害者のアカウント情報が攻撃者の意図した内容に変更される。
6)結果として被害者は「利用者情報を変更される」といった被害を受け、攻撃者は変更されたメールアドレスで通知を受け取るなどして更なる不正(アカウントの乗っ取りや金銭的被害など)につなげることが可能になる。
1)攻撃者が自分の利用者アカウントでサイトXにログインし、編集画面等から有効なcsrf_tokenを取得する(図4のリクエストにあるように編集用POSTにはcsrf_tokenが含まれる)。
2)攻撃者は以下のような外部ページ(攻撃ページ)を用意する。攻撃ページには、送信先を /shop/editmemberにするHTMLフォームを置き、フォームの隠し項目に取得した攻撃者のcsrf_tokenをセットし、変更したい利用者情報(例えばmailや氏名)を設定しておく。フォームはページ読み込み時に自動送信されるようにする。
3)攻撃者は詐欺メールなどで複数の会員をその攻撃ページに誘導する。
4)被害者が攻撃ページを開くと、ブラウザが自動的にPOSTを送信する。ブラウザは被害者のSESSIONIDをCookieヘッダに付与して送る(本文にあるようにSESSIONIDはSameSite未設定の状態)。POSTのメッセージボディには攻撃者が埋めたcsrf_tokenが含まれる。
5)サーバは受信したcsrf_tokenを検証するが、表2の挙動が示す通り「別アカウントで取得したcsrf_tokenでも正常に処理」してしまうため、被害者のアカウント情報が攻撃者の意図した内容に変更される。
6)結果として被害者は「利用者情報を変更される」といった被害を受け、攻撃者は変更されたメールアドレスで通知を受け取るなどして更なる不正(アカウントの乗っ取りや金銭的被害など)につなげることが可能になる。
以上が、下線③に示された「利用者に被害を与える攻撃」の具体的手順です。ポイントは「攻撃者は自分のcsrf_tokenだけを用意すればよく、被害者のSESSIONIDを盗む必要はない」点と「サーバ側がcsrf_tokenとセッションの対応を正しく検証していない」点です。
誤りやすいポイント
-
攻撃者が被害者のSESSIONIDを盗む必要があると誤解する
→ 実際はブラウザがログイン状態のSESSIONIDを自動送信するため、攻撃者はSESSIONIDの窃取を行わなくてもよい。 -
csrf_tokenの存在だけで安全だと考える
→ トークンは「発行されたトークンがそのセッションに属するか」をサーバ側で照合する必要がある。表2の手順3の挙動は「別セッションのトークンでも受け入れている」ことを示す。 -
SameSiteの挙動を誤解する
→ SameSite=Strictは外部サイトからのリクエストでCookieを送らない(より厳格にブロック)。SameSite=Laxはトップレベルの安全なGET(リンクのクリック等)ではCookieを送るが、クロスサイトのPOSTは送らない点が異なる。今回の攻撃はPOSTベースであるため、Laxの設定は有効となるケースが多いが、GETベースの攻撃はLaxでは防げない。 -
XSSと混同する
→ XSSがあるとさらに深刻(トークン窃取や任意JS実行)になるが、今回説明する攻撃はCSRFの手法であり「被害者を誘導して被害者のブラウザから正規のリクエストを出させる」点に特徴がある。
FAQ
Q: 攻撃者はcsrf_tokenをどうやって入手するのですか?
A: 攻撃者は自分の利用者アカウントでログインして編集画面等から自身のcsrf_tokenを取得すればよい(図4のリクエストにcsrf_tokenが含まれている)。今回の脆弱性では「別アカウントで取得したtokenでも通る」ため、この方法で十分です。なお、XSSが存在すれば被害者のトークンを直接窃取することも可能です。
A: 攻撃者は自分の利用者アカウントでログインして編集画面等から自身のcsrf_tokenを取得すればよい(図4のリクエストにcsrf_tokenが含まれている)。今回の脆弱性では「別アカウントで取得したtokenでも通る」ため、この方法で十分です。なお、XSSが存在すれば被害者のトークンを直接窃取することも可能です。
Q: 被害者が自分でフォームを送信しないと攻撃は成立しませんか?自動送信は可能ですか?
A: 自動送信は可能です。攻撃者は攻撃ページに読み込み時に自動でsubmitするスクリプトを置くか、ユーザを誘導してボタンを押させることでPOSTを発生させられます。ブラウザは自動送信時もCookieを送るため成立します。
A: 自動送信は可能です。攻撃者は攻撃ページに読み込み時に自動でsubmitするスクリプトを置くか、ユーザを誘導してボタンを押させることでPOSTを発生させられます。ブラウザは自動送信時もCookieを送るため成立します。
Q: SameSiteを設定すればこの攻撃は完全に防げますか?
A: SameSiteの設定は有効な防御手段の一つです。今回のようなクロスサイトPOSTを利用した攻撃ではSameSite=LaxまたはStrictの設定によりブラウザがCookieを送らなくなり阻止できます。ただし、確実な対策はサーバ側でcsrf_tokenをセッションに紐付けて照合すること、及びOrigin/Refererチェックなどを組み合わせることです(複数の防御を重ねるのが望ましい)。
A: SameSiteの設定は有効な防御手段の一つです。今回のようなクロスサイトPOSTを利用した攻撃ではSameSite=LaxまたはStrictの設定によりブラウザがCookieを送らなくなり阻止できます。ただし、確実な対策はサーバ側でcsrf_tokenをセッションに紐付けて照合すること、及びOrigin/Refererチェックなどを組み合わせることです(複数の防御を重ねるのが望ましい)。
関連キーワード: クロスサイトリクエストフォージェリ(CSRF)、CSRFトークン、SameSite属性、セッションCookie、Origin/Referer検証
設問2:〔CSRFについて〕について答えよ。
問題文を見る模範解答
a:×
b:×
c:○
d:×
解説
解答の論理構成
- 問題文は「SameSite属性は、Strict、Lax、Noneの三つの値のうちのいずれかを取る。」と述べ、さらに「サイトX内で遷移する場合と外部WebサイトからサイトXに遷移する場合では、SameSite属性の値によってサイトXのcookie送信の有無が表3のように異なる。」と示しています。
- Webブラウザの標準仕様では
• Strict … “完全同一サイト”でのみcookieを送信。外部サイト → 対象サイトへの全リクエスト(GET/POST)では 送信しない。
• Lax … “安全なナビゲーション(GET)”には送信するが、同一サイト外からの POSTなどの変更系リクエスト には送信しない。 - したがって表3の空欄は次のように決定できます。
・a(Strict/外部→GET)→送信しない → “×”
・b(Strict/外部→POST)→送信しない → “×”
・c(Lax/外部→GET)→送信する → “○”
・d(Lax/外部→POST)→送信しない → “×” - よって模範解答は
a:× b:× c:○ d:× となります。
誤りやすいポイント
- 「Laxは“外部サイトからでもGETなら送る”」という例外を忘れ、Strictと同じ挙動と誤解する。
- POSTだけでなくiframe・img等のサブリソース読み込み時の挙動を混同し、GET =常に安全と決めつける。
- Noneを「制限なし」と覚えた結果、StrictとLaxの違いを軽視してしまう。
FAQ
Q: Noneを選ぶときの追加要件はありますか?
A: Secure属性を同時に付与しなければブラウザが拒否します。TLSが必須です。
A: Secure属性を同時に付与しなければブラウザが拒否します。TLSが必須です。
Q: Laxで外部サイトからフォームPOSTしたらCSRFは防げますか?
A: 通常はcookieが送信されないため防げますが、一部ブラウザが古い仕様のままだと例外があるためトークン方式との併用が推奨です。
A: 通常はcookieが送信されないため防げますが、一部ブラウザが古い仕様のままだと例外があるためトークン方式との併用が推奨です。
Q: Strictを使うと利便性は下がりますか?
A: 外部サイト上のリンクから直接アクセスしたときにセッションが引き継がれないため、再ログインが必要になるなどユーザビリティに影響します。
A: 外部サイト上のリンクから直接アクセスしたときにセッションが引き継がれないため、再ログインが必要になるなどユーザビリティに影響します。
関連キーワード: SameSite, CSRF, SecureCookie, GETリクエスト、POSTリクエスト
設問3:〔認可制御の不備について〕について答えよ。
問題文を見る(1)本文中の下線④について、どのような攻撃手法を用いれば攻撃が成功するか。30字以内で答えよ。
模範解答
order-codeの下6桁を総当たりで試行する。
解説
解答の論理構成
-
注文管理番号の構造
表1には
――「注文履歴は、注文年月である数字6桁とランダムな英大文字6桁の値をハイフンでつないだ注文管理番号で管理される。」――
とあり、前半6桁(202404など)は推測容易です。 -
適切な攻撃手法の導出
・推測できる部分:年月6桁
・未知の部分:ランダム英大文字6桁
未知部分を機械的に全通り試行する「総当たり(ブルートフォース)攻撃」であれば、order-codeを知らずともヒットするまで繰り返しリクエストを送れます。
したがって下線④で問われる攻撃手法は
「order-codeの下6桁を総当たりで試行する」
となります。
誤りやすいポイント
- SQLインジェクションやディレクトリトラバーサルと混同する。実際には単なるID列挙型のブルートフォースです。
- 「数字6桁とランダムな英大文字6桁」を全体で推測困難と考え、総当たりを諦めてしまう。前半6桁は月次で容易に特定できます。
- レスポンスにレートリミットやCAPTCHAがある前提で考えてしまう。本問ではその制御が記述されていません。
FAQ
Q: 総当たりを防ぐためには何を実装すべきですか?
A: アカウントごとの認可チェックに加え、リクエスト回数制限やCAPTCHA、長くランダムな不可測IDの採用が有効です。
A: アカウントごとの認可チェックに加え、リクエスト回数制限やCAPTCHA、長くランダムな不可測IDの採用が有効です。
Q: 前半6桁(年月)も変化があるのでは?
A: 過去の注文履歴閲覧を狙う場合でも、対象月を一つずつ変えながら同様に試行できるため依然としてリスクが残ります。
A: 過去の注文履歴閲覧を狙う場合でも、対象月を一つずつ変えながら同様に試行できるため依然としてリスクが残ります。
Q: 総当たりは現実的ですか?
A: 26⁶ 通りありますが、並列化・自動化が可能であり、Webアプリ側に適切なレート制限や監査がなければ実行され得ます。
A: 26⁶ 通りありますが、並列化・自動化が可能であり、Webアプリ側に適切なレート制限や監査がなければ実行され得ます。
関連キーワード: ブルートフォース、認可チェック、ID列挙、レートリミット、クレデンシャルスタッフィング
設問3:〔認可制御の不備について〕について答えよ。
問題文を見る(2)本文中の下線⑤について、サイトXのWebアプリに追加すべき処理を、60字以内で具体的に答えよ。
模範解答
cookieの値で利用者アカウントを特定し、order-codeの値から特定したものと違っていれば、エラーにする。
解説
解答の論理構成
-
認可制御の不備の内容
問題文では、利用者αのリクエスト
「order-code=202404-AHUJKI¹」を「order-code=202404-BAKCXW」に書き換えるだけで
「利用者αが、本来は閲覧できないはずの利用者βの注文履歴を閲覧できる」
とあります。これはリクエストパラメータだけで対象利用者が切替わり、サーバ側がログイン中の利用者とorder-codeの所有者を照合していないことを示します。 -
認可チェックの本質
サーバは既にcookieのSESSIONIDで「誰がログインしているか」を特定できます(問題文に「SESSIONIDには、値とSecure属性だけがセットされる」と記載)。
ところが注文履歴表示処理では、このセッションに結び付けられた会員番号と、リクエストで受け取ったorder-codeの所有者を比較する処理がありません。 -
必要な追加処理
したがってWebアプリ側で
・SESSIONIDから会員を特定
・その会員が保有するorder-codeかをDBで照合
・一致しなければエラー応答
という認可チェックを挟むことで、不正閲覧を防止できます。
誤りやすいポイント
- 認証(ログイン)と認可(権限確認)を混同し、単にログインしていれば安全と考えてしまう。
- パラメータ改竄防止にHMACなどの署名を追加する案を答え、設問が求める「認可チェックの追加」から外れる。
- クライアント側のJavaScriptで比較すればよいと勘違いし、サーバ側処理の必要性を見落とす。
FAQ
Q: 「order-code」自体に利用者情報が含まれているのだから改竄検知できるのでは?
A: 問題文注¹に「値から利用者を特定することができる」とあるものの、サーバが照合処理を行わなければ意味がありません。
A: 問題文注¹に「値から利用者を特定することができる」とあるものの、サーバが照合処理を行わなければ意味がありません。
Q: CSRFトークンのようにorder-codeに署名を持たせれば十分ですか?
A: 署名でも有効ですが、本問は「⑤サイトXのWebアプリに追加すべき処理」を問うており、サーバ側での所有者照合が本質的対策となります。
A: 署名でも有効ですが、本問は「⑤サイトXのWebアプリに追加すべき処理」を問うており、サーバ側での所有者照合が本質的対策となります。
Q: セッション固定攻撃対策と同時に実装すべきですか?
A: SESSIONIDの適切な管理(Secure, HttpOnly, SameSite等)は前提ですが、本問の解説範囲は認可チェック追加に限定されます。
A: SESSIONIDの適切な管理(Secure, HttpOnly, SameSite等)は前提ですが、本問の解説範囲は認可チェック追加に限定されます。
関連キーワード: 認可チェック、パラメータ改竄、セッション管理、アクセス制御
設問4:〔SSRFについて〕について答えよ。
問題文を見る(1)本文中の下線⑥について、ログインができないのはなぜか。SSRF攻撃の特徴を基に、35字以内で答えよ。
模範解答
変更後のURLにPOSTデータは送ることができないから
解説
解答の論理構成
- ⑥の状況
- 問題文では「図7のリクエストのパラメータの値をWebサーバYのCMSの管理ログイン画面のURLに変更することで、その画面にアクセスできるが、ログインはできない」とあります。
- SSRFで発生するリクエストの性質
- SSRFは「利用者のWebブラウザがWebサーバYに送るリクエスト」を改変し、そのままWebサーバYが内部へ GET リクエストを発行する形で成立します。
- CMS側の認証仕様
- 図2には「ログインは、POSTメソッドでは許可されるが、GETメソッドでは許可されない。」と記載されています。
- 結論
- SSRFで送られるのは GET リクエストなので、CMSへは資格情報(ID・パスワード)を載せた POST データを渡せません。
- したがって「変更後のURLにPOSTデータは送ることができないから」が解答となります。
誤りやすいポイント
- 「アクセスできる=ログインできる」と誤解し、メソッド制限の記述を見落とす。
- SSRFをクライアント側のクロスサイト攻撃と混同し、ブラウザがPOSTできないと勘違いする。実際にはサーバ側がGETとして送る点が本質です。
- CMSの初期パスワード運用やIP制限と結び付け、この設問の直接原因と混同してしまう。
FAQ
Q: SSRFでもPOSTメソッドで内部へリクエストを送れる場合はありますか?
A: Webアプリ側が任意メソッドを指定できる実装(本文中の「方法G」など)がある場合は可能です。本設問の⑥は図7の単純改変でありGET固定です。
A: Webアプリ側が任意メソッドを指定できる実装(本文中の「方法G」など)がある場合は可能です。本設問の⑥は図7の単純改変でありGET固定です。
Q: CMSの初期パスワードがそのままでも、なぜログインできなかったのですか?
A: 初期パスワードの有無以前に、GETメソッドでは認証情報を送信できずCMSが受け付けません。
A: 初期パスワードの有無以前に、GETメソッドでは認証情報を送信できずCMSが受け付けません。
Q: メソッド制限を回避してSSRFでPOSTを送信できるケースは危険ですか?
A: 危険です。本文で示された「方法G」はまさに任意メソッド・任意ヘッダを送れるため、IMDS方式2でもクレデンシャルを盗まれるとZ社が指摘しています。
A: 危険です。本文で示された「方法G」はまさに任意メソッド・任意ヘッダを送れるため、IMDS方式2でもクレデンシャルを盗まれるとZ社が指摘しています。
関連キーワード: SSRF, GETメソッド、POSTメソッド、メソッド制限、認証情報
設問4:〔SSRFについて〕について答えよ。
問題文を見る(2)本文中の下線⑦について、クレデンシャル情報を取得する方法を、具体的に答えよ。
模範解答
パラメータpageの値をIMDSのクレデンシャル情報を返すURLに変更する。
解説
解答の論理構成
- 図7に示されるリクエストでは、ブラウザが
GET /top?page=https://△△△.jp/topic/202404.html HTTP/1.1
という形でパラメータpageの値をWebサーバYに渡しています。 - 本文は「図7のリクエストのパラメータの値を別のURLに変更するという方法(以下、方法Fという)でSSRFを悪用して、クレデンシャル情報を取得し…」と記述し、pageの値を書き換えればWebサーバYが内部でそのURLを取得してしまうSSRF(Server-Side Request Forgery)が成立することを示しています。
- では、どのURLなら「クレデンシャル情報」を返すのか。図2の説明には
「https://○○○.○○○.○○○.○○○/meta-data/credential にGETメソッドでアクセスされると、クラウドW上のサービスのクレデンシャル情報を返す。」
とあります。ここがIMDS(Instance Metadata Service)で、VPC内部からしかアクセスできない特殊なエンドポイントです。 - WebサーバYはVPC内にあるため、このIMDSへのリクエストにアクセス可能です。したがって攻撃者はpageにIMDSのURLを指定するだけで、WebサーバYがIMDSからクレデンシャルを取得し、そのレスポンスを攻撃者に返してしまいます。
- 以上より、下線⑦の「クレデンシャル情報を取得する方法」の具体的内容は
パラメータpageの値をhttps://○○○.○○○.○○○.○○○/meta-data/credential などIMDSのクレデンシャル情報取得用URLに変更する、という操作になります。
誤りやすいポイント
- CMS管理ログイン画面(/admin)のURLに書き換えても「ログインはできない」ため、ここを答えにしてしまうミス。
- IMDSの方式1・方式2の違いを意識せず「トークンを発行するURLに変更」と誤記。本文では「D社では、方式1を採用する」とありトークンは不要です。
- SSRFは「ブラウザが直接IMDSにアクセスする」と勘違いしがちですが、実際にアクセスするのはWebサーバYである点を忘れがちです。
FAQ
Q: IMDSのURLはグローバルIPですか?
A: いいえ。「IMDSには、インターネットから直接アクセスできないプライベートIPアドレス(○○○.○○○.○○○.○○○)」と記載されており、VPC内からのみ到達可能です。
A: いいえ。「IMDSには、インターネットから直接アクセスできないプライベートIPアドレス(○○○.○○○.○○○.○○○)」と記載されており、VPC内からのみ到達可能です。
Q: なぜブラウザにクレデンシャルが返ってくるのですか?
A: WebサーバYがIMDSへ内部リクエストを行い、そのレスポンス内容(クレデンシャル情報)をそのまま外部に返す実装になっているためです。
A: WebサーバYがIMDSへ内部リクエストを行い、そのレスポンス内容(クレデンシャル情報)をそのまま外部に返す実装になっているためです。
Q: 方式2でも同じ攻撃はできますか?
A: 方式2では単純なGETだけでは取得できませんが、本文は「方法Gを用いれば…クレデンシャル情報を取得し」と示しており、追加ヘッダとメソッドを細工すれば攻撃可能です。
A: 方式2では単純なGETだけでは取得できませんが、本文は「方法Gを用いれば…クレデンシャル情報を取得し」と示しており、追加ヘッダとメソッドを細工すれば攻撃可能です。
関連キーワード: SSRF, IMDS, クレデンシャル情報、URLパラメータ、メタデータサービス
設問4:〔SSRFについて〕について答えよ。
問題文を見る(3)本文中の下線⑧について、方法Gを用いてクレデンシャル情報を取得する方法を、具体的に答えよ。
模範解答
トークンを発行するURLにPUTメソッドでアクセスしてトークンを入手し、そのトークンをリクエストヘッダに含めて、IMDSのクレデンシャル情報を返すURLにアクセスする。
解説
解答の論理構成
-
IMDS(インスタンスメタデータサービス)方式2の仕様確認
- 問題文に「方式2:トークンを発行するURLにPUTメソッドでアクセスし、レスポンスボディに含まれるトークンを入手してから、そのトークンをリクエストヘッダに含めて特定のURLにアクセスすると情報を取得できる。」とある。
- つまり、方式2では
① PUTでトークン取得 → ② 取得したトークンをヘッダに付与したリクエストでメタデータ(クレデンシャル情報)取得
という2段階が必須になる。
-
方法Gの特徴を整理
- 本文で「図7のリクエストのパラメータの値を変更することで、WebサーバYから送られるリクエストに任意のメソッドの指定及び任意のヘッダの追加ができる方法(以下、方法Gという)がある。」と説明されている。
- すなわち攻撃者はSSRFを利用し、WebサーバYに
• 任意メソッド(PUT / GETなど)
• 任意ヘッダ
を含む内部向けリクエストを送信させられる。
-
方法Gで方式2を突破する手順
- ステップ1:方法Gにより、IMDSの「トークンを発行するURL」に対してPUTメソッドを発行させる。レスポンスボディにトークンが返る。
- ステップ2:得られたトークンをX-aws-ec2-metadata-token(名称はクラウド依存だが問題文の「そのトークンをリクエストヘッダに含めて」に該当)等のヘッダに設定し、IMDSの「クレデンシャル情報を返すURL」にアクセスさせる。
- ステップ3:IMDSは正当なトークン付きリクエストと判断し「クラウドW上のサービスのクレデンシャル情報」を返す。
- 以上が下線⑧「クレデンシャル情報を取得し」を可能にする具体手順であり、模範解答
「トークンを発行するURLにPUTメソッドでアクセスしてトークンを入手し、そのトークンをリクエストヘッダに含めて、IMDSのクレデンシャル情報を返すURLにアクセスする。」
になる。
誤りやすいポイント
- 「GETにトークンをクエリ文字列で付与すれば良い」と誤解し、ヘッダに載せる要件を落とす。
- 方式1と方式2を混同し、トークン取得のPUTが不要だと思い込む。
- 方法Gの「任意メソッド・任意ヘッダ付与」能力を見落とし、「ヘッダは追加できないのでは?」と判断してしまう。
- SSRFの経路(利用者 → WebサーバY → IMDS)を想像できず、攻撃者が直接IMDSに届くと誤認する。
FAQ
Q: PUTで取得したトークンはどのヘッダ名で送れば良いのですか?
A: クラウドごとに名称は異なりますが、問題文では「そのトークンをリクエストヘッダに含めて」とだけ指示しています。代表例としてX-aws-ec2-metadata-tokenなどが用いられます。
A: クラウドごとに名称は異なりますが、問題文では「そのトークンをリクエストヘッダに含めて」とだけ指示しています。代表例としてX-aws-ec2-metadata-tokenなどが用いられます。
Q: なぜ1回のリクエストでクレデンシャル情報を取れないのですか?
A: 方式2は「事前にPUTでトークン取得 → そのトークンを使った本リクエスト」という二段階認証のような仕組みになっているためです。1回ではトークンが無く認証に失敗します。
A: 方式2は「事前にPUTでトークン取得 → そのトークンを使った本リクエスト」という二段階認証のような仕組みになっているためです。1回ではトークンが無く認証に失敗します。
Q: SameSite属性の追加ではSSRFを防げませんか?
A: SameSiteはブラウザから送信されるcookieを制御する対策であり、サーバ側から内部リソースへ送信するSSRFとは無関係です。
A: SameSiteはブラウザから送信されるcookieを制御する対策であり、サーバ側から内部リソースへ送信するSSRFとは無関係です。
関連キーワード: SSRF, メタデータサービス、トークン認証、HTTPメソッド、ヘッダインジェクション
設問4:〔SSRFについて〕について答えよ。
問題文を見る(4)本文中の下線⑨について、サイトYのWebアプリに追加すべき処理を、35字以内で具体的に答えよ。
模範解答
パラメータpageの値がサイトP以外のURLならエラーにする。
解説
解答の論理構成
- 原因把握
本文は「⑥図7のリクエストのパラメータの値をWebサーバYのCMSの管理ログイン画面のURLに変更することで、その画面にアクセスできる」
「⑦図7のリクエストのパラメータの値を別のURLに変更するという方法…でSSRFを悪用して、クレデンシャル情報を取得し、ストレージWから情報を盗み出すことができる」と述べ、pageパラメータが任意URLを許容するためSSRFが成立していることを示しています。 - 被害の大きさ
「⑧クレデンシャル情報を取得し、ストレージWから情報を盗み出すことができる」とあるように、クラウド管理権限まで奪取される重大リスクです。 - 求められる対策
本文は「⑨サイトYのWebアプリに追加すべき処理」を問うています。SSRFは外向きリクエストの送信先を制限することで封じ込められます。 - 想定される正答
サイトYが本来リクエストすべき外部サイトは「△△△.jp」(サイトP)だけです。従ってpageにそれ以外のURLが来た場合は処理を拒否すればよく、これが最小かつ効果的な修正になります。
誤りやすいポイント
- ブラックリストで弾くと回避策が漏れがち。必ず「ホワイトリスト」で許可制御する必要があります。
- GET/POST切替やIMDS方式2だけで安全と誤解しやすいが、本文は「方法Gを用いれば…情報を盗み出すことができる」と明言しており不十分です。
- ネットワークACLだけではアプリ層のURL変換を防げない点を見落としがちです。
FAQ
Q: ホワイトリストにIPアドレス表記も含めた方がよいですか?
A: FQDNだけでなく、同一ホストを指すIP直書きやURLエンコード形も拒否できるよう正規化処理を併用してください。
A: FQDNだけでなく、同一ホストを指すIP直書きやURLエンコード形も拒否できるよう正規化処理を併用してください。
Q: URL妥当性検証のライブラリ利用は必須ですか?
A: 自前実装は抜け漏れを生む恐れがあるため、標準ライブラリや成熟したOSSを利用し、正規化+ホワイトリストを組み合わせるのが推奨です。
A: 自前実装は抜け漏れを生む恐れがあるため、標準ライブラリや成熟したOSSを利用し、正規化+ホワイトリストを組み合わせるのが推奨です。
Q: IMDSへのアクセス制御を強化しても十分ではないのですか?
A: IMDSを守ってもSSRFが別資産へ届く可能性は残るため、アプリ側で送信先を限定する対策が不可欠です。
A: IMDSを守ってもSSRFが別資産へ届く可能性は残るため、アプリ側で送信先を限定する対策が不可欠です。
関連キーワード: SSRF, URLホワイトリスト、入力値検証、パラメータバリデーション、クレデンシャル漏洩






