情報処理安全確保支援士 2018年 春期 午後2 問02
Webサイトのセキュリティに関する次の記述を読んで、設問1~6に答えよ。
A社は、従業員数1,200名のマスメディア関連会社である。A社では、提供するサービスごとにWebサイトを用意し、インターネット上に公開している。Webサイトには、情報提供サイトやショッピングサイトなど様々なものがある。Webサイトでは、Webアプリケーションソフトウェア(以下、Webアプリという)が動作し、その設計、実装、テスト(以下、この3工程を開発という)及び運用は、Webサイトごとに情報システム子会社B社又は外部の業者に委託されている。多くのWebサイトでは、キャンペーンなどのたびに、開発とリリースを繰り返している。
〔現状のセキュリティ施策〕
A社では、脆弱性を作り込まないようにするために、Webサイトのライフサイクルの五つの工程(要件定義、設計、実装、テスト、運用)に関するセキュリティガイドライン(以下、Webセキュリティガイドという)を整備している。現行のWebセキュリティガイド第1版を図1に示す。

Webセキュリティガイドは、開発及び運用を委託している外部の業者にも順守を義務付けている。
〔Webサイトの運用について〕
A社のカスタマサポートサービス提供用のWebサイトXは、A社のデータセンタXに設置されている。WebサイトXは、B社に開発と運用を委託している。データセンタXとB社本社のシステム構成を図2に示す。

WebサーバX上では、WebアプリXが稼働している。WebアプリXは、Webアプリケーションフレームワーク(以下、WFという)の一つであるWF-Kを使用して開発されている。
WebサイトXとシステム構成が全く同じWebサイトYを、別のデータセンタYに災害対策用として設置している。WebサイトX稼働時にはWebサイトYは、インターネットに公開しておらず、ホットスタンバイの状態で運用している。
WebサイトXとWebサイトYのソフトウェアの脆弱性修正プログラム(以下、パッチという)は、3か月ごとの定期メンテナンス日にB社運用チームのCさんが適用している。Cさんは、新しいパッチが公開されているかを定期メンテナンス日の前に確認し、もしあれば、まずWebサイトYにパッチを適用している。WebサイトYでの稼働に問題がなければ、WebサイトXにもパッチを適用している。コンテンツも、まずWebサイトYを更新し、問題がなければ、WebサイトXを更新している。パッチ適用とコンテンツ更新は、B社PC-LAN上のCさんのPCから行っている。
なお、B社では、全従業員にPCが1台ずつ貸与されており、そのPCでWebサイトを閲覧して情報を収集したり、電子メール(以下、メールという)を送受信したりしている。
〔セキュリティインシデントの発生〕
ある日、WebサイトXの利用者から、WebサイトXのダウンロードページでファイルをダウンロードしたところ、マルウェア対策ソフトが警告を表示したという連絡があった。Cさんがダウンロードページを確認したところ、あるダウンロードファイルへのリンクが外部のURLに改ざんされていた。Cさんは運用チームのリーダであるDさんに報告し、WebサイトYに切り替えるべきかを相談した。Dさんは、切り替えるとWebサイトYも改ざんされてしまうことを懸念して、WebサイトYには切り替えないようCさんに伝えた。代わりに、DNSサーバの設定を変更して、メンテナンス中であることを表示するサーバに切り替えるようCさんに指示した。Dさんは、すぐにA社に連絡し、ファイルへのリンクが改ざんされたと伝えた。その後、A社のWebサイトX及びWebサイトYの担当部署のEさんがセキュリティ専門業者に連絡して、今後の対応について相談することになった。
〔セキュリティ専門業者による調査〕
セキュリティ専門業者の情報処理安全確保支援士(登録セキスペ)であるF氏が、被害の状況を調査した。調査内容と調査結果を表1に示す。
F氏は、DさんとEさんに調査結果を伝えた。次は、その時のF氏、Dさん、Eさんの会話である。
F氏 :脆弱性Kは、改ざんの3週間前に公表されたものです。
Dさん:そうですか。その脆弱性は、認識していませんでした。すぐに確認して、パッチを適用します。仮に、認識していたとしてもパッチ適用は定期メンテナンス日、つまり、来週の月曜日にしていたと思うので、やはり改ざんされていましたね。
F氏 :ダウンロードページのリンク以外に外部のURLに改ざんされているページはありませんでした。しかし、スクリプトを埋め込まれるなど、他の形でページが改ざんされている可能性もあるので確認が必要です。
Dさん:分かりました。ページの改ざんは、実際にはどのように確認すればよいでしょうか。
F氏 :WebサイトXの全ファイルをaして確認すると漏れがなく、効率も良いでしょう。
Dさん:なるほど。分かりました。
F氏 :調査結果は以上です。
Eさん:ありがとうございました。攻撃手法Kによって実際にWebサーバXを改ざんできるかどうかを知りたいので、調査してもらえないでしょうか。また、他に脆弱性がないかについても調査をお願いします。
F氏 :分かりました。
F氏が、まず、WebサイトXに対して、攻撃手法Kによる攻撃を実施したところ、実際にWebサーバXを改ざんできることが確認できた。
次に、他に脆弱性がないか、WebサイトYに対してB社PC-LANからOS及びミドルウェア(以下、プラットフォームという)の診断並びにWebアプリXの診断を実施した。
プラットフォームの診断では、メンテナンスで使っているSSHサービスに対して辞書攻撃が容易に成功することが確認された。F氏がCさんにセキュリティ上の問題がないか確認したところ、“SSHサービスはB社PC-LANからだけアクセスできるように設定しているので問題はないと考えている”とのことであった。F氏によるとB社PC-LAN内に攻撃者が侵入できると、WebサイトYに不正にログインできる。そこで、F氏は、②SSHの認証方式をパスワード認証方式以外に設定するようDさんにアドバイスした。また、この設定をしたとしても、メンテナンスに自分のPCを利用するのはセキュリティ上の問題があるので、新たにメンテナンス専用PCを準備し、それをB社運用チームだけが利用できるようにすることをアドバイスした。次に、WebアプリXを診断したところ、XSSの脆弱性が5件検出された。F氏の調査結果を基に、Dさんは、脆弱性Kに対するパッチ適用、SSHサービスの設定変更、メンテナンス専用PCの準備、XSSが検出されたプログラムの修正及びWebサイトXの復旧を行うようCさんに指示した。Cさんは1週間で対応を完了し、WebサイトXが再稼働した。
〔全社のWebサイトのセキュリティ強化〕
セキュリティインシデントの発生及びF氏の調査結果を受けて、A社の情報システム担当役員であるG取締役は、全社のWebサイトのセキュリティを強化するよう、A社情報システム部長を通じて同部のH課長に指示した。H課長は、WF、プラットフォーム及びWebアプリの脆弱性について調査を開始し、対策を検討することにした。
WF及びプラットフォームの脆弱性については、Webサイトの改ざんなどの被害につながるので、全社のWebサイトについて脆弱性への対応状況を調査した。その結果、対応漏れがあるWebサイトが5サイト見つかった。漏れがあった理由を各Webサイト担当者にヒアリングしたところ、脆弱性が発表されていることを知らなかったとのことであった。
そこで、今後は情報システム部が一括して脆弱性情報を収集し、各Webサイト担当者にその情報を提供することにした。それに先立って、効率的な情報収集ができるよう、各Webサイト担当者には、bを報告させた。また、Webサイトの更改などに伴ってbに変更がある場合は、その都度報告させることにした。
パッチ適用は従来どおり各Webサイト担当者に任せることにしたが、脆弱性情報を提供するだけでは、パッチ適用の遅れによって被害が出ることも考えられるので、パッチ適用期限をWebセキュリティガイドに追加することにした。
Webアプリの脆弱性については、まず、今回検出されたXSSを作り込んだ原因について、B社にヒアリングした。その結果、Webセキュリティガイドの記載が抽象的なので、誤った実装をしてしまったことが分かった。そこで、全ての担当者が正しい実装方法を理解できるように、Webセキュリティガイドを改訂して具体的な実装方法を追加することにした。改訂後のWebセキュリティガイド第2版を図3に示す。

また、Webアプリの診断の実施状況について各Webサイト担当者にヒアリングしたところ、“Webサイトの開発スケジュールが短くて、診断をセキュリティ専門業者に依頼するとリリースに間に合わないので、診断できずにリリースすることがある”とのことであった。そこで、H課長は情報システム部が中心となって、いつでもすぐに診断を実施できるように、A社内にWebアプリを診断できる体制を作ることをG取締役に提案し、採用された。
〔自社による診断の実施検討〕
的確な診断を実施できる体制を作るには、A社内で診断する項目(以下、A社診断項目という)を定め、その項目の診断手順に診断員が習熟する必要があり、H課長は、診断手順の作成と習熟には、1年は掛かると考えた。それを少しでも短くするために、診断経験があり、登録セキスペでもある部下のQさんと一緒にA社診断項目と診断手順を検討した。
検討の結果、外部で公開されていた診断項目を参考にして、Webアプリに関するA社診断項目を図4のとおり定めた。
診断方法には、自動診断ツールによる診断と手動による診断がある。A社では自動診断ツールとして、自動診断ツールJを使う予定である。自動診断ツールによる診断は効率的だが、ツールによっては診断できない項目もある。そこで、2人は両方の診断方法を組み合わせることにした。それを踏まえて作成した診断手順書第1版を図5に示す。
その後、A社の情報システム部のメンバ3名が、Qさんのトレーニングを受け、診断チームを結成した。しかし、トレーニングを受けただけでは、最初から精度の高い診断結果を安定して出せないかもしれない。そこで、当初はセキュリティ専門業者が診断を実施する際に同時に診断を実施することとし、両者の診断結果を比較・検証して、経験を積むことにした。
〔WebサイトZに対する診断の実施〕
A社のある部署が、新規に構築したショッピング用のWebサイトZをリリースするに当たり、セキュリティ専門業者に診断を依頼した。その際に、診断チームのメンバのLさんにも診断を担当させることにした。WebサイトZの開発は、外部の業者のP社に委託しており、委託時にWebセキュリティガイドの最新版を渡している。WebサイトZの画面遷移図を図6に、画面遷移の仕様を表2に示す。

Lさんは、WebサイトZに対して診断を実施し、結果をとりまとめた。Lさんは、Lさんの診断結果と、セキュリティ専門業者の診断結果とを比較した。すると、両者ともに検出したものが1件、セキュリティ専門業者だけが検出したものが3件あった。WebサイトZの診断結果を表3に示す。
(イ)の脆弱性については、商品購入情報入力画面から、配達希望日を入力するために起動するカレンダ機能で検出された。カレンダ機能を図7に示す。

セキュリティ専門業者が脆弱性を確認するためにカレンダを開き、そのカレンダが表示されているポップアップウィンドウのアドレスバーに入力したURLを図8に、警告ダイアログに“NG”を表示させたレスポンスの該当箇所を図9に示す。
なお、(イ)の脆弱性は、WebサイトZとは異なるドメインのサイトから、図8のURLにアクセスさせられるような攻撃を受けた場合でも、現在普及しているWebブラウザの多くでは、スクリプトの実行時にエラーが発生し、攻撃が失敗する。しかし、Webブラウザの種類やバージョンによっては被害が発生するおそれがあるので、セキュリティ専門業者は修正することを提言した。
(ウ)の脆弱性は、有料会員だけが購入できることになっている限定商品を一般会員が購入できてしまうというものであった。セキュリティ専門業者が確認した方法を表5に示す。
表3の診断結果から、Qさんは脆弱性を作り込まないようWebセキュリティガイドに項目を追加した。さらに、XSSの脆弱性をよく作り込むパターン、アクセス制御の不備や認可制御の欠落及びdリクエストフォージェリについて、診断手順書を改訂して、診断手順を追加した。改訂された診断手順書第2版を図10に示す。
WebサイトZで検出された脆弱性は、リリース前に修正するようA社のWebサイトZの担当者からP社に伝えた。Qさんが、脆弱性が作り込まれた原因をP社に確認したところ、いずれも確認不足であるとのことであった。
〔改善案の検討〕
Qさんは、各工程でのレビューポイントをWebセキュリティガイドに記載することをH課長に提案した。改訂されたWebセキュリティガイド第3版を図11に示す。

しかし、今回のように開発を外部の業者に委託する場合、図11に従って開発されていることを確認するには工夫が必要である。そこで、H課長は、③外部に開発を委託する契約の検収条件に追加すべき記載内容を検討した。
H課長は、その後もWebセキュリティガイドの改善を続けた。迅速なパッチ適用の効果もあり、A社では、今のところWebサイトへの攻撃による被害は起きていない。
設問1:〔セキュリティ専門業者による調査〕について、(1)〜(3)に答えよ。
問題文を見る(1)表1中の下線①について、アクセスログに残らないのは、どのような攻撃の場合か。35字以内で述べよ。
模範解答
攻撃に使われる文字列がPOSTデータ内に含まれている場合
解説
解答の論理構成
- 表1‐No.3の調査結果には
“攻撃手法Kに使われる文字列がWebサーバXの標準設定では①アクセスログに残らない”
と明記されています。 - 一般的なWebサーバ標準ログ(Common Log Formatなど)は、リクエストライン(メソッド・URL・HTTPバージョン)とヘッダ部までを記録しますが、POSTメソッドのボディ部は記録しません。
- したがって、攻撃者が「特定の文字列」をPOSTボディに埋め込んで送信すると、その文字列はログに出力されず、痕跡が残りません。
- 以上より、“アクセスログに残らない”攻撃とは「攻撃文字列がPOSTデータ内に含まれる場合」であると結論付けられます。
誤りやすいポイント
- GETクエリストリングと混同し、URLパラメタに含まれる場合はログに残る点を見落とす。
- SSL/TLSで暗号化されているから残らないと勘違いする(復号後にWebサーバは平文で受け取り、ログ可能です)。
- サーバのログレベル変更やWAFの影響を過度に考慮し、標準設定という前提を忘れる。
FAQ
Q: POST以外でもログに残らないケースはありますか?
A: 標準設定のままならPOSTボディ以外はほぼ記録されます。ただし、運用者がログ項目を削減している場合などはヘッダ部も残らないことがあります。
A: 標準設定のままならPOSTボディ以外はほぼ記録されます。ただし、運用者がログ項目を削減している場合などはヘッダ部も残らないことがあります。
Q: どうすればPOSTデータもログに残せますか?
A: Webサーバやリバースプロキシの設定でボディ部をキャプチャするモジュールを導入する、もしくはWAF/IDSでHTTPボディを解析・記録する方法があります。
A: Webサーバやリバースプロキシの設定でボディ部をキャプチャするモジュールを導入する、もしくはWAF/IDSでHTTPボディを解析・記録する方法があります。
Q: 脆弱性診断時にログに残らない攻撃を検知する他の手段は?
A: アプリケーション側の監査ログ、DBアクセスログ、OS監査ログなど多層で記録を取り、相互に突合する方法が有効です。
A: アプリケーション側の監査ログ、DBアクセスログ、OS監査ログなど多層で記録を取り、相互に突合する方法が有効です。
関連キーワード: HTTPメソッド、POSTデータ、アクセスログ、脆弱性、Webサーバ
設問1:〔セキュリティ専門業者による調査〕について、(1)〜(3)に答えよ。
問題文を見る(2)本文中のaに入れる適切な確認方法を、表1の結果を考慮し、20字以内で具体的に述べよ。
模範解答
a:WebサイトYの全ファイルと比較
解説
解答の論理構成
- 調査の目的
- 会話でF氏は“他の形でページが改ざんされている可能性もあるので確認が必要”と述べています。
- 安全な参照元の条件
- 表1 No.5で“WebサイトY”は“外部からのアクセスはなく、改ざんされた痕跡も見付けられなかった。”と判明。
- さらに本文では“WebサイトXとシステム構成が全く同じWebサイトY”であると明記されています。
- 比較対象の選定理由
- 同一構成かつ無改ざんの“WebサイトY”を基準にすれば、改ざん漏れなく効率的に確認できます。
- 結論
- 以上より、a には“WebサイトYの全ファイルと比較”が最適となります。
誤りやすいポイント
- バックアップファイルとの比較と書くと、バックアップが改ざんを受けていない保証が本文にないため誤答になります。
- 差分ツールで比較とだけ書くと「何と比較するか」が不明確で減点対象になります。
- ハッシュ値確認のみではファイル選択の根拠が示せず不完全です。
FAQ
Q: なぜ“WebサイトY”でなければならないのですか?
A: 表1で改ざんがないと確認され、かつ本文で“WebサイトXとシステム構成が全く同じ”とあるため、信頼できるベースラインになるからです。
A: 表1で改ざんがないと確認され、かつ本文で“WebサイトXとシステム構成が全く同じ”とあるため、信頼できるベースラインになるからです。
Q: 比較方法を具体的に書かなければいけませんか?
A: 設問は「確認方法」を問うため、“全ファイルと比較”のように具体的な作業内容を示す必要があります。
A: 設問は「確認方法」を問うため、“全ファイルと比較”のように具体的な作業内容を示す必要があります。
Q: ハッシュ値を使わないとだめですか?
A: ハッシュ値の使用自体は有効ですが、設問は20字以内で方法を聞いているため、出題の意図は“何と比較するか”を明確にすることです。
A: ハッシュ値の使用自体は有効ですが、設問は20字以内で方法を聞いているため、出題の意図は“何と比較するか”を明確にすることです。
関連キーワード: ファイル改ざん検知、ベースライン比較、ハッシュチェック、ホットスタンバイ、災害対策
設問1:〔セキュリティ専門業者による調査〕について、(1)〜(3)に答えよ。
問題文を見る(3)本文中の下線②について、設定すべき認証方式の名称を、10字以内で答えよ。
模範解答
公開鍵認証方式
解説
解答の論理構成
- 下線②の原文は
“F氏は、②SSHの認証方式をパスワード認証方式以外に設定するようDさんにアドバイスした。”
とあります。 - その直前でF氏は「SSHサービスに対して辞書攻撃が容易に成功することが確認された」と述べ、
“B社PC-LAN内に攻撃者が侵入できると、WebサイトYに不正にログインできる”
というリスクを指摘しています。 - 辞書攻撃が成功する原因は、推測しやすい“パスワード認証方式”を採用しているからです。
- SSHで辞書攻撃・ブルートフォース攻撃を回避でき、かつ「パスワード認証方式以外」に該当する代表的な方式は、ユーザが保持する秘密鍵とサーバに登録された公開鍵で認証を行う “公開鍵認証方式” です。
- 以上より、②に設定すべき認証方式は
公開鍵認証方式
となります。
誤りやすいポイント
- 「多要素認証」「ワンタイムパスワード」などを挙げる受験者もいますが、SSHの一般設定で簡潔に切り替えられる方式としては“公開鍵認証方式”が最も妥当です。
- “証明書認証”と書くとTLSサーバ証明書と混同されるおそれがあり減点対象になる場合があります。
- SSH‐2ではキーファイルを使った方式が標準であることを忘れ、旧来のrlogin/rshの“ホストベース認証”と誤記するケースがあります。
FAQ
Q: パスワード認証方式を残しつつ公開鍵を追加すれば良いですか?
A: 攻撃対象を残さないためには、原則として“PasswordAuthentication no”に設定し公開鍵のみに絞る方が安全です。
A: 攻撃対象を残さないためには、原則として“PasswordAuthentication no”に設定し公開鍵のみに絞る方が安全です。
Q: 公開鍵認証方式でも鍵が漏えいしたら同じでは?
A: 漏えいリスクはありますが、鍵長を十分に取り、安全な保管・パスフレーズ設定を行えば辞書攻撃より格段に安全性が高まります。
A: 漏えいリスクはありますが、鍵長を十分に取り、安全な保管・パスフレーズ設定を行えば辞書攻撃より格段に安全性が高まります。
Q: TOTPなどの多要素認証をSSHに組み込む方法はありますか?
A: Yes。OpenSSHとPAMを組み合わせてGoogle Authenticatorなどを導入する例がありますが、本設問は基本設定変更を問うものなので公開鍵認証方式が解答となります。
A: Yes。OpenSSHとPAMを組み合わせてGoogle Authenticatorなどを導入する例がありますが、本設問は基本設定変更を問うものなので公開鍵認証方式が解答となります。
関連キーワード: SSH, 公開鍵認証、辞書攻撃、ブルートフォース、パスワード認証
設問2:
問題文を見る本文中のbに入れる適切な報告内容を、50字以内で具体的に述べよ。
模範解答
b:Webサイトで使用しているOS、ミドルウェア及びWFの名称並びにそれぞれのバージョン情報
解説
解答の論理構成
- 背景把握
問題文には「全社のWebサイトについて脆弱性への対応状況を調査した。その結果、対応漏れがあるWebサイトが5サイト見つかった。」とあります。対応漏れの原因を無くすため、情報システム部が脆弱性情報を一括収集する方針が示されました。 - 報告項目の目的
同じ文章で「効率的な情報収集ができるよう、各Webサイト担当者には、bを報告させた。」と指示されています。外部から入手する脆弱性情報を“効率的”に各サイトへマッチさせるには、サイトごとの利用ソフトウェアとそのバージョンを特定する必要があります。 - 必須要素の抽出
本文中で脆弱性対象として具体的に挙がっているのは「WF」「プラットフォーム(OSやミドルウェア)」です(例:表1「WF-Kに脆弱性Kが存在」との記述)。したがって、報告すべきは
• OS
• ミドルウェア
• WF
これらの「名称」と「バージョン」です。名称だけでは該当する脆弱性か判断できず、バージョンだけでなく種類も必要となるため両方を盛り込みます。 - 解答
よってbには「Webサイトで使用しているOS、ミドルウェア及びWFの名称並びにそれぞれのバージョン情報」と記載するのが妥当です。
誤りやすいポイント
- ハードウェアやIPアドレス等、脆弱性情報収集に直接不要な項目まで列挙してしまう。
- 「アプリ名」「OS名」だけでバージョンを抜かす。バージョンが分からなければ適用要否を判断できません。
- Webアプリ固有の名称(例:WebアプリX)を報告対象に含める。脆弱性データベースは一般的な製品・OSS単位で公開されるため対象外です。
- WF(Webアプリケーションフレームワーク)を失念する。フレームワークの脆弱性も多く報告されるので必須です。
FAQ
Q: データベース製品の名称・バージョンも入れるべきでは?
A: 問題文では主要な脆弱性対象を「OS、ミドルウェア及びWF」としています。DBは一般にミドルウェアに含まれるため、ミドルウェアに記載すれば網羅できます。
A: 問題文では主要な脆弱性対象を「OS、ミドルウェア及びWF」としています。DBは一般にミドルウェアに含まれるため、ミドルウェアに記載すれば網羅できます。
Q: ミドルウェアの範囲はどこまで?
A: Webサーバ、DBサーバ、アプリケーションサーバなどOS上で動作するソフトウェア一式を指します。Webサーバだけに限定すると不足します。
A: Webサーバ、DBサーバ、アプリケーションサーバなどOS上で動作するソフトウェア一式を指します。Webサーバだけに限定すると不足します。
Q: 名前とバージョンを定期的に報告する理由は?
A: バージョンアップや構成変更があった際に速やかに脆弱性情報を突合できるようにするためです。古い情報のままでは適切なパッチ適用期限を設定できません。
A: バージョンアップや構成変更があった際に速やかに脆弱性情報を突合できるようにするためです。古い情報のままでは適切なパッチ適用期限を設定できません。
関連キーワード: 脆弱性情報収集、パッチ管理、ミドルウェア、バージョン管理、フレームワーク
設問3:
問題文を見る模範解答
c:ディレクトリ
d:クロスサイト
e:HTTP
f:ジャッキング
解説
解答の論理構成
- 【問題文】の図4の箇条書きには、
- “・c トラバーサル”
- “・d リクエストフォージェリ”
- “・e ヘッダインジェクション”
- “・クリック f”
という未確定語が列挙されています。
- 一般的な脆弱性名称との対応を考えると、
- “トラバーサル”と組み合わせる語は “ディレクトリ” が標準表記です(Directory Traversal)。
- “リクエストフォージェリ”に冠する語は “クロスサイト” が定訳で、CSRF(Cross-Site Request Forgery)の和訳でもあります。
- “ヘッダインジェクション”の前に付く典型は “HTTP” です(HTTP Header Injection)。
- “クリック”の後に続く脆弱性語は “ジャッキング” が通例で、クリックジャッキング攻撃を指します。
- さらに、表3でも “(エ)” の脆弱性名が “d リクエストフォージェリ” となっており、ここでも “クロスサイト” を補えば意味が通ります。
- 以上より、
- c:ディレクトリ
- d:クロスサイト
- e:HTTP
- f:ジャッキング
が妥当と判断できます。
誤りやすいポイント
- “ディレクトリトラバーサル”を“パストラバーサル”と混同して別語を入れる。
- “クロスサイトリクエストフォージェリ”を“サイト間”などで訳してしまい正式名称を外す。
- “HTTPヘッダインジェクション”を“レスポンスヘッダインジェクション”と誤記する。
- “クリックジャッキング”を“クリックハイジャック”と書く誤表記。
FAQ
Q: “ディレクトリトラバーサル”と“パストラバーサル”はどちらを使っても良いですか?
A: 試験では和訳として最も一般的な“ディレクトリトラバーサル”を採用することが多いです。
A: 試験では和訳として最も一般的な“ディレクトリトラバーサル”を採用することが多いです。
Q: “クロスサイトリクエストフォージェリ”の略称CSRFを解答に使えますか?
A: 設問が“字句”を求めている場合、正式な日本語表記“クロスサイト”を記入するのが無難です。
A: 設問が“字句”を求めている場合、正式な日本語表記“クロスサイト”を記入するのが無難です。
Q: “HTTPヘッダインジェクション”はレスポンスとリクエストの両方に関係しますか?
A: 主にレスポンスヘッダを任意操作できる脆弱性ですが、用語としては“HTTPヘッダインジェクション”で統一されています。
A: 主にレスポンスヘッダを任意操作できる脆弱性ですが、用語としては“HTTPヘッダインジェクション”で統一されています。
関連キーワード: Directory Traversal, CSRF, HTTP Header Injection, Clickjacking
設問4:〔WebサイトZに対する診断の実施〕について、(1)〜(4)に答えよ。
問題文を見る模範解答
g:30
h:0
解説
解答の導き方
まず表4の該当部分を整理します。表4には診断ツールJの入出力結果として次の3件が示されています。
・keywordの値が「bag' and '1'='1'」のとき、表示件数が [g] 件。
・keywordの値が「bag' and '1'='2'」のとき、表示件数が [h] 件。
・keywordの値が「bag」のとき、表示件数が「30件」。さらに注記で「診断時にDBには商品が100件登録されていた」とあります。
・keywordの値が「bag' and '1'='1'」のとき、表示件数が [g] 件。
・keywordの値が「bag' and '1'='2'」のとき、表示件数が [h] 件。
・keywordの値が「bag」のとき、表示件数が「30件」。さらに注記で「診断時にDBには商品が100件登録されていた」とあります。
自動診断ツールが用いる「and '1'='1'」「and '1'='2'」は、SQL注入の有無を調べる典型的なペイロードです。入力値がそのままSQL文のWHERE節の文字列リテラルの中ではなく文字列リテラルを閉じた後に埋め込まれる場合、次のようなSQLが組み立てられると考えられます(ここでは簡潔化した一例を示します)。
例)アプリ側で入力を連結している場合に想定されるWHERE節の一部
WHERE name LIKE 'bag' ← keyword が 「bag」の場合
WHERE name LIKE 'bag' and '1'='1' ← keyword が 「bag' and '1'='1'」 の場合
WHERE name LIKE 'bag' and '1'='2' ← keyword が 「bag' and '1'='2'」 の場合
WHERE name LIKE 'bag' and '1'='1' ← keyword が 「bag' and '1'='1'」 の場合
WHERE name LIKE 'bag' and '1'='2' ← keyword が 「bag' and '1'='2'」 の場合
これらの評価を行います。'1'='1' は常に真(tautology)なので、2行目は条件としては
(name LIKE 'bag') AND (TRUE) = (name LIKE 'bag')
となり、表示件数はkeywordが「bag」のときと同じになります。したがって [g] は「bag」で得られる件数、すなわち30です。
(name LIKE 'bag') AND (TRUE) = (name LIKE 'bag')
となり、表示件数はkeywordが「bag」のときと同じになります。したがって [g] は「bag」で得られる件数、すなわち30です。
一方 '1'='2' は常に偽なので、3行目は
(name LIKE 'bag') AND (FALSE) = FALSE
となり、該当行は一切なくなります。したがって [h] は0です。
(name LIKE 'bag') AND (FALSE) = FALSE
となり、該当行は一切なくなります。したがって [h] は0です。
以上より、表4の観測結果とSQLの真偽評価から [g] = 30、[h] = 0と導けます。
誤りやすいポイント
- AND と OR を取り違えると誤答する。AND '1'='1' は元の条件を維持するが、OR '1'='1' なら全件(この問題では100件)を返す可能性がある点を区別する必要があります。
- LIKE とワイルドカード(%)の扱いに注意すること。ワイルドカードを不適切に挿入すると文字列リテラルの閉じ方が崩れ、構文エラーになるため、実際にどう埋め込まれているか(% が付くかどうか)を意識して考える必要があります。
- 入力値がエスケープ済み、あるいはプレースホルダ(パラメタ化)で処理されている場合はこの種の注入は起きないため、観測結果(件数の変化)を手がかりに「注入が有効か」を判断すること。
- 自動診断ツールは表示件数などの差分から判定することが多い点を理解しておくと、表の数値が何を意味するか把握しやすくなります。
FAQ
Q: なぜ [g] がDBの全件数(100)にならないのですか?
A: 質問の入力は AND '1'='1' であり、これは元の条件と論理積を取るため元の絞り込み(ここではname LIKE 'bag')が残ります。全件を返すのは OR '1'='1' のように元の条件を常に真にする場合です。
A: 質問の入力は AND '1'='1' であり、これは元の条件と論理積を取るため元の絞り込み(ここではname LIKE 'bag')が残ります。全件を返すのは OR '1'='1' のように元の条件を常に真にする場合です。
Q: 表4の入力がもし「%」を含む形で埋め込まれていたら結果は変わりますか?
A: アプリが入力を "%...%" のようにワイルドカードで囲んで埋め込んでいると、単純に "bag' and '1'='1'" を入れると文字列リテラルの閉じ方が崩れて構文エラーになることがあります。観測された出力(30件/0件)と整合するのは、入力が上で示したように単純に '...' の中に入って閉じられ、その後に AND 条件が付与されているケースです。
A: アプリが入力を "%...%" のようにワイルドカードで囲んで埋め込んでいると、単純に "bag' and '1'='1'" を入れると文字列リテラルの閉じ方が崩れて構文エラーになることがあります。観測された出力(30件/0件)と整合するのは、入力が上で示したように単純に '...' の中に入って閉じられ、その後に AND 条件が付与されているケースです。
Q: この結果だけで「SQLインジェクションがある」と断定できますか?
A: 表4のように、tautologyとcontradictionで表示件数が変化する(特に矛盾で0件になる)場合は、入力がSQL文に影響を与えている強い証拠です。実務では更に構文の確認やログ解析などで確証を取りますが、診断ツールのこの差分は脆弱性の存在を示す重要な手がかりです。
A: 表4のように、tautologyとcontradictionで表示件数が変化する(特に矛盾で0件になる)場合は、入力がSQL文に影響を与えている強い証拠です。実務では更に構文の確認やログ解析などで確証を取りますが、診断ツールのこの差分は脆弱性の存在を示す重要な手がかりです。
関連キーワード: SQLインジェクション、LIKE句、入力値検証、プレースホルダ(パラメタ化)、論理式
設問4:〔WebサイトZに対する診断の実施〕について、(1)〜(4)に答えよ。
問題文を見る解答群
ア:"><script>alert('NG');</script>
イ:');alert('NG
ウ:'alert('NG');
エ:<script>alert('NG');</script>
模範解答
i:イ
解説
解答の導き方
-
注目すべき箇所を確認します。図8のURLは「https://www.z-site.com/calendar?inputfieldid= i」で、図9の該当コードは「var returnobj = window.opener.document.getElementById('i');」とあります。つまり、アドレスバーのinputfieldidの値が、getElementByIdの単一引用符で括られた引数部分にそのまま埋め込まれます。
-
ここで実行したいのはポップアップ側のスクリプト内でJavaScriptを実行させ、警告ダイアログに "NG" を出すことです。埋め込まれた文字列をそのまま表示させるだけではなく、スクリプトとして動かすには「単一引用符で囲まれた文字列リテラル」を破ってJavaScriptの文を挿入する必要があります。具体的には、まず開いている文字列を閉じる「'」と、getElementByIdの呼び出しを終える「)」が必要で、その直後に実行したい文(alert('NG'))を置く、という手順になります。
-
選択肢を比較します。実行に必要な「文字列の終了 → 関数呼び出しの終了 → alertの呼び出し」という流れを作れるのは、先頭が「')」で始まりかつalertを含むものだけです。選択肢イは「');alert('NG」で、先頭に「')」がありalertを含んでいます。他の候補は以下の理由で不適切です。
- ア/エ:いずれも<script>タグを挿入する形で、これはHTMLとして挿入される場面(例えばinnerHTML)で有効ですが、ここはJavaScriptの文字列リテラル内なのでそのまま実行されません。
- ウ:先頭が「'alert(...」となっており、開いた文字列を閉じる「'」で始まっていません(文字列を閉じた上で ) を付ける必要があるため、文の分離・実行ができません)。
-
挿入のイメージを示します。もとの行に選択肢イを入れると、次のようになります。
var returnobj = window.opener.document.getElementById('');alert('NG');
getElementById('')の呼び出しが終わった直後に alert('NG'); という文が続き、末尾の「');」は図9にもともとある部分がそのまま使われます。構文として正しいJavaScriptになるので、ポップアップのスクリプト実行時に警告ダイアログが出ます。以上より、正しい選択は選択肢イです。
誤りやすいポイント
- 「<script>を入れれば実行される」と考える誤り:スクリプトタグ挿入型はHTMLコンテキストでの攻撃で、今回のようにパラメータがJavaScriptの文字列リテラル内に埋め込まれている場合は効かないことが多いです。
- 文字列の開始/終了の扱いを見落とすこと:getElementByIdの引数が '...' で囲まれている点(シングルクォート)を見落とすと、どのように抜け出せばよいか判断できません。
- URLエンコードを忘れること:実際に攻撃文字列をURLに入れる際には特殊文字を適切にエンコードする必要がある点を見落としがちです(試験では選択肢そのままの比較で判断します)。
FAQ
Q: なぜアやエの<script>が効かないのですか?
A: 図9を見ると値はJavaScriptの文字列リテラル「'... '」として埋め込まれており、ここに <script> を入れても文字列の一部として扱われるためブラウザは実行しません。実行させるには文字列リテラルを破る必要があります。
A: 図9を見ると値はJavaScriptの文字列リテラル「'... '」として埋め込まれており、ここに <script> を入れても文字列の一部として扱われるためブラウザは実行しません。実行させるには文字列リテラルを破る必要があります。
Q: 選択肢イは「');alert('NG」で終わり、閉じる引用符や「);」がありませんが、本当に動作しますか?
A: 動作します。図9では空欄の後ろに「');」が続いているので、挿入後は「getElementById('');alert('NG');」となり、alertの引数の文字列と呼び出しが、もとのコードの「');」で正しく閉じられます。このように、埋め込み先の後ろに続くコードまで含めて構文が成立するように攻撃文字列を作るのが、この種のXSSの特徴です(実環境ではさらにURLエンコード等で正しく渡す必要があります)。
A: 動作します。図9では空欄の後ろに「');」が続いているので、挿入後は「getElementById('');alert('NG');」となり、alertの引数の文字列と呼び出しが、もとのコードの「');」で正しく閉じられます。このように、埋め込み先の後ろに続くコードまで含めて構文が成立するように攻撃文字列を作るのが、この種のXSSの特徴です(実環境ではさらにURLエンコード等で正しく渡す必要があります)。
Q: この脆弱性の防止には何をすればよいですか?
A: 外部入力をJavaScriptコードに直接埋め込まない、あるいは適切にエスケープ/エンコードすること、さらに可能ならば値を直接スクリプトに埋め込むのではなくDOM APIで安全にアクセスすることが有効です。
A: 外部入力をJavaScriptコードに直接埋め込まない、あるいは適切にエスケープ/エンコードすること、さらに可能ならば値を直接スクリプトに埋め込むのではなくDOM APIで安全にアクセスすることが有効です。
関連キーワード: クロスサイトスクリプティング、DOM-based XSS、JavaScript文字列リテラル、URLエンコード、入力値検証、getElementById
設問4:〔WebサイトZに対する診断の実施〕について、(1)〜(4)に答えよ。
問題文を見る模範解答
j:(う)の操作を実行するときに、codeの値を限定商品の値に書き替える
解説
解答の論理構成
- 表5は「一般会員アカウント」で限定商品を買えてしまう手順を示しています。
Step2の説明は「商品一覧画面で j。」と空欄になっています。 - 商品をカートに入れる処理は、表2の(う)と(え)が同じURL「https://www.z-site.com/kounyu」を使い、送信パラメタだけが異なります。
- (う)「POSTデータ:code=0001344」
- (え)「POSTデータ:code=1000021」
- 限定商品は有料会員専用の「限定商品一覧」からしか選べない設計ですが、URLとパラメタを直接操作できれば制約を回避できます。
- よって一般会員が「商品一覧画面」から購入リクエスト(う)を送る際に、codeパラメタを限定商品の値「1000021」に書き替えれば、サーバ側が区別できず限定商品がカートに入ります。
- 以上より、j に入る操作内容は「(う)の操作を実行するときに、codeの値を限定商品の値に書き替える」です。
誤りやすいポイント
- (え)の画面遷移そのものを呼び出すと回答してしまう。問題は「商品一覧画面」経由であるため、操作は(う)のリクエスト改変になります。
- URL変更だけを書くと不十分になりがちです。パラメタcode=1000021への書替えを明示する必要があります。
- 「限定商品一覧画面に遷移する」と誤解するケース。アクセス制御不備の本質はサーバ側の認可チェック不足であり、画面遷移は不要です。
FAQ
Q: なぜ限定商品一覧画面に遷移せずに購入できるのですか?
A: サーバ側の認可ロジックがcodeパラメタ値だけで商品をカートに入れており、会員種別を再確認していないためです。
A: サーバ側の認可ロジックがcodeパラメタ値だけで商品をカートに入れており、会員種別を再確認していないためです。
Q: URLの直接入力とパラメタ改ざんはどう違いますか?
A: URL直接入力は画面遷移そのものを指定し直す行為、パラメタ改ざんは本来の画面から送るリクエスト内の値を書き替える行為です。今回は後者です。
A: URL直接入力は画面遷移そのものを指定し直す行為、パラメタ改ざんは本来の画面から送るリクエスト内の値を書き替える行為です。今回は後者です。
Q: この脆弱性を防ぐにはどうするべきでしょう?
A: 購入処理時にサーバ側で会員種別と商品種別を照合し、権限がなければエラーにする認可チェックを実装します。
A: 購入処理時にサーバ側で会員種別と商品種別を照合し、権限がなければエラーにする認可チェックを実装します。
関連キーワード: パラメータ改ざん、アクセス制御、認可チェック、URL操作、セッション管理
設問4:〔WebサイトZに対する診断の実施〕について、(1)〜(4)に答えよ。
問題文を見る模範解答
k:権限が異なる複数の
l:許可されている操作の違い
解説
解答の論理構成
- 図10には
“アクセス制御の不備や認可制御の欠落を確認する場合には、事前に k アカウントを用意し、l を確認する。”
とあり、k と l を埋める必要があります。 - 表5では一般会員で操作した際に
“限定商品を購入できる。”
という想定外の結果が示されており、手順1には
“一般会員アカウントでログイン”
と明記されています。
これは「権限が異なる」アカウント(一般会員/有料会員)を比較して認可の欠落を検証する典型例です。 - したがって k には、テストに用意すべきアカウントの性質として “権限が異なる複数の” が入ります。
- 次に、検証の目的は「有料会員しか操作できない購入手続を一般会員が実行できてしまうか」を確かめることです。
表5の結果が示すのは「許可されている操作」が会員種別によって異なるはずなのに同じになってしまった点です。 - 以上より l には、両アカウント間で比較すべき対象として “許可されている操作の違い” が入ります。
誤りやすいポイント
- 認証テストと混同し、“異なるパスワードの有無” など認可とは無関係な観点を l に書いてしまう。
- “複数のテストユーザ” のように k を一般化し過ぎ、権限差があることを示せていない。
- UI上に表示されるリンクやボタンの有無だけを比較し、実際にリクエストを送って機能を実行できるかどうかを確認しない。
FAQ
Q: なぜ“権限が異なる複数の” と書く必要があるのですか?
A: 表5で一般会員でも限定商品を購入できたように、アクセス制御の欠落は権限差を持つアカウントを比較して初めて発見できます。そのため、異なる権限を持つテストアカウントが必須です。
A: 表5で一般会員でも限定商品を購入できたように、アクセス制御の欠落は権限差を持つアカウントを比較して初めて発見できます。そのため、異なる権限を持つテストアカウントが必須です。
Q: “許可されている操作の違い” は具体的にどう確認しますか?
A: それぞれのアカウントで同じリクエストを送り、レスポンスや処理結果(例:画面表示、DB登録内容)を比較します。本来禁止されている操作が成功すれば脆弱性ありと判定します。
A: それぞれのアカウントで同じリクエストを送り、レスポンスや処理結果(例:画面表示、DB登録内容)を比較します。本来禁止されている操作が成功すれば脆弱性ありと判定します。
Q: アカウントが1種類しか用意できない場合はどうすればよいですか?
A: テスト環境でロールやフラグを変更し、疑似的に別権限を作成します。最低でも“想定される最上位権限”と“最低権限”の二つを用意してください。
A: テスト環境でロールやフラグを変更し、疑似的に別権限を作成します。最低でも“想定される最上位権限”と“最低権限”の二つを用意してください。
関連キーワード: アクセス制御、認可、権限管理、テストアカウント
設問5:
問題文を見る本文中の下線③について、検収条件に追加すべき記載内容は何か。40字以内で具体的に述べよ。
模範解答
作業の妥当性を確認できる詳細なレビュー記録を委託先が提出していること
解説
解答の論理構成
- 追加すべき内容は、外部委託先が“レビューを実施した事実と結果”を検収時に示すことです。
- 【問題文】では、内製時の管理強化策として図11に
「注意事項:各工程の最後にレビューを行い、作業の妥当性を確認すること」
と明示し、さらに各工程に
「レビューポイント:~がテストされていること、適切な診断が実施されていること」
など“妥当性確認”を求めています。 - しかし、外部委託では「開発されていることを確認するには工夫が必要」と課題を示し、③で“契約の検収条件”に反映させるよう求めています。
- 検収条件にレビュー結果提出を義務付ければ、A社側は成果物と併せてレビュー記録を照査し、図11が意図する“作業の妥当性”を客観的に確認できます。
- 以上から、「作業の妥当性を確認できる詳細なレビュー記録を委託先が提出していること」とするのが適切です。
誤りやすいポイント
- 「テスト結果」や「診断報告書」だけを求めれば十分と勘違いする
→ 図11は全工程でのレビュー実施を要求しており、設計・実装フェーズも対象です。 - 「ソースコード提出」を検収条件に挙げる
→ 妥当性“確認”にはレビューの証跡が不可欠で、コード提出だけでは図11の趣旨を満たしません。 - “レビュー実施の誓約”のような宣言だけで済ませる
→ 客観的証跡がなければ検収時に確認できず、契約条件として不十分です。
FAQ
Q: どの程度の詳細さが“詳細なレビュー記録”に当たりますか?
A: レビュー対象・日時・参加者・指摘事項・是正内容・確認結果など、再現性をもって妥当性を追跡できるレベルが望まれます。
A: レビュー対象・日時・参加者・指摘事項・是正内容・確認結果など、再現性をもって妥当性を追跡できるレベルが望まれます。
Q: レビュー記録のフォーマットはA社指定とすべきですか?
A: 指定すると比較・保管が容易になりますが、最低限“項目を網羅していること”を条件とし、フォーマットは委託先標準でも運用可能です。
A: 指定すると比較・保管が容易になりますが、最低限“項目を網羅していること”を条件とし、フォーマットは委託先標準でも運用可能です。
Q: オフショア開発でも同じ条件を適用できますか?
A: 可能です。言語やタイムゾーンが異なっても、レビュー記録は電子化されているため同様に提出・確認できます。
A: 可能です。言語やタイムゾーンが異なっても、レビュー記録は電子化されているため同様に提出・確認できます。
関連キーワード: レビュー記録、検収条件、アウトソーシング、品質保証、セキュリティ要件
設問6:
問題文を見る診断で見つかった個々の脆弱性はWebセキュリティガイドを改善するためにどのように利用できるか。40字以内で述べよ。
模範解答
脆弱性の作り込み原因を調査して、注意すべきポイントを追加する。
解説
解答の論理構成
- まず、検出されたXSSについて「Webセキュリティガイドの記載が抽象的なので、誤った実装をしてしまった」と【問題文】に記載されています。
→ 原因分析がガイド改訂に直結した事実を示しています。 - さらに「Qさんは脆弱性を作り込まないようWebセキュリティガイドに項目を追加した」とあるように、診断で判明した欠陥を即座にガイドへ反映しています。
- この流れは「各工程でのレビューポイントをWebセキュリティガイドに記載する」取り組みにも発展しており、脆弱性発見→原因特定→注意点追加というサイクルが明確です。
- 以上より、診断で見つかった個々の脆弱性は“原因を調査し、注意すべきポイントとしてガイドへ追加する”形で活用されると導けます。
【最終解答】
脆弱性の作り込み原因を調査して、注意すべきポイントを追加する。
脆弱性の作り込み原因を調査して、注意すべきポイントを追加する。
誤りやすいポイント
- 「見付かった脆弱性を一覧に追加するだけ」と誤解し、原因分析の必要性を落とす。
- ガイド改善=テスト工程強化と短絡的に結び付け、要件定義・設計へのフィードバックを忘れる。
- “注意点追加”をパッチ適用手順の追加と読み違え、本質的な開発プロセス改善を外してしまう。
FAQ
Q: 単に脆弱性を修正するだけでは不十分ですか?
A: はい。【問題文】にあるように原因まで掘り下げてガイドへ反映しないと再発防止になりません。
A: はい。【問題文】にあるように原因まで掘り下げてガイドへ反映しないと再発防止になりません。
Q: 診断結果を活用するタイミングはいつですか?
A: 検出直後に原因分析を行い、次版ガイドやレビューポイントへ即時反映する運用が望ましいです。
A: 検出直後に原因分析を行い、次版ガイドやレビューポイントへ即時反映する運用が望ましいです。
Q: 注意すべきポイントの例は何ですか?
A: 「エスケープ処理を施すこと」「プレースホルダで実装すること」など、具体的な実装指針が該当します。
A: 「エスケープ処理を施すこと」「プレースホルダで実装すること」など、具体的な実装指針が該当します。
関連キーワード: 脆弱性診断、原因分析、ガイドライン改訂、再発防止













