戦国IT - 情報処理技術者試験の過去問対策サイト
お知らせお問い合わせ料金プラン

情報処理安全確保支援士 2015年 春期 午後101


Webサイトの脆弱性と対策に関する次の記述を読んで、設問1~3に答えよ。

 S社は、情報システムの構築、運用、コンサルティングなどのサービスを顧客に提供する従業員数5,000名の企業である。S社にはセキュリティプロフェッショナルグループ(以下、SPGという)という組織があり、Webアプリケーションソフトウェア(以下、Webアプリという)の脆弱性を検査するサービス(以下、脆弱性検査という)を提供している。  SPGでは、脆弱性検査に従事できる者を認定するために、技能試験を実施している。技能試験は、Webアプリに脆弱性が作り込まれた、技能試験用のWebサイト(以下、試験用サイトという)を用いて実施される。試験用サイトは、個人間で取引するオークションシステムを想定しており、“http://...”及び“https://...”の画面がある。図1に試験用サイトの画面構成と画面の遷移を、図2に画面Cの概要をそれぞれ示す。また、試験用サイトの機能のうち、セッション管理機能の仕組みを図3に、検索文字列の引継機能の仕組みを図4に示す。
情報処理安全確保支援士試験(平成27年度 午後1 問01 図01)
情報処理安全確保支援士試験(平成27年度 午後1 問01 図02)
情報処理安全確保支援士試験(平成27年度 午後1 問01 図03)
情報処理安全確保支援士試験(平成27年度 午後1 問01 図04)
〔技能試験〕  SPG に新たに配属された従業員は研修検査員と呼ばれ、2 か月間の研修を終えると、技能試験を受ける。技能試験に合格した者だけが脆弱性検査を実施できる規則になっている。技能試験では、脆弱性検査専用のWebブラウザを使用する。検査専用のWebブラウザには、一般的なWebブラウザの機能に加えて、送信する HTTP リクエストやパラメタの値を意図的に変更する機能がある。  技能試験では、試験官とのディスカッション、検査手順や報告書の作成を通して、力量が判断され、合否が決定される。このたび、研修検査員の T 君が、技能試験を受けることになった。試験官は U主任である。最初に、U主任は、技能試験の前提として図1及び図2の内容を T 君に伝えた。  なお、図3及び図4の内容は T 君には伏せられている。   〔検査シナリオと HTTP ヘッダ〕  技能試験の開始に当たって、U主任は、図5に示す検査シナリオの順番で画面にアクセスするよう T 君に指示した。T 君が検査シナリオを実行した際の HTTP リクエストヘッダ及びHTTPレスポンスヘッダを、図6に示す。
情報処理安全確保支援士試験(平成27年度 午後1 問01 図05)
情報処理安全確保支援士試験(平成27年度 午後1 問01 図06)
〔脆弱性に関するディスカッション〕  次は、図6に関するU主任とT君のディスカッションである。
 U主任:図6中のレスポンスXについて、セキュリティ上、気になる点があれば指摘してください。  T君 :Set-Cookie ヘッダに、①secure 属性が設定されていません。secure属性を設定しないと、セッションIDを第三者に盗聴されるリスクがあり、セッションハイジャックなどにつながると思います。  U主任:他に、図6全体を通して、気になる点はありますか。  T君 :HTTPヘッダインジェクションの脆弱性が存在する可能性があります。図7の検査コードをリクエストのクエリ文字列のパラメタの値にセットし、スクリプトの実行ができるかどうか、確認してみます。
情報処理安全確保支援士試験(平成27年度 午後1 問01 図07)
情報処理安全確保支援士試験(平成27年度 午後1 問01 図08)
 T君が、図7の検査コードを用いて確認したところ、予想どおり、警告ダイアログが表示された。T 君は、HTTPヘッダインジェクションの脆弱性が存在することを指摘した。
 T君 :サーバ側での HTTP レスポンスヘッダの出力処理に問題があり、HTTP ヘッダインジェクションの脆弱性が存在すると思います。具体的には、入力された検索文字列を適切に処理せずに Set-Cookie ヘッダの値にセットしているものと思われます。この脆弱性を突いた攻撃では、b 攻撃と同様に、攻撃者が指定した任意のスクリプトをクライアント側で実行できます。  U主任:仮に問題があるとした場合、Set-Cookie ヘッダの値をセットするサーバ側の処理において、どのような対策が考えられますか。  T君 :幾つかの対策があります。例えば、HTTP レスポンスヘッダを適切に出力するために、Web アプリの実行環境やプログラム言語が用意している、ヘッダ出力用の関数や API を使用する方法が考えられます。それが使用できない場合は、c するといった処理を開発者が自身で実装する方法も考えられます。  U主任:その他に気になる点はありますか。  T君 :はい。図6の一連の HTTP ヘッダのうち、例えば、行番号 d と行番号 e を見比べると、サーバ側のセッション管理に問題があり、セッションフィクセーションの脆弱性が存在する可能性があります。攻撃者が Cookie Monster Bug を突く攻撃や、前述した HTTP ヘッダインジェクション攻撃を組み合わせることによって、セッションフィクセーションを成功させる可能性があります。図9に攻撃手順の一例を示します。  T君 :サーバ側でのHTTPレスポンスヘッダの出力処理に問題があり、HTTPヘッダインジェクションの脆弱性が存在すると思います。具体的には、入力された検索文字列を適切に処理せずにSet-Cookieヘッダの値にセットしているものと思われます。この脆弱性を突いた攻撃では、b攻撃と同様に、攻撃者が指定した任意のスクリプトをクライアント側で実行できます。U主任:仮に問題があるとした場合、Set-Cookieヘッダの値をセットするサーバ側の処理において、どのような対策が考えられますか。T君:幾つかの対策があります。例えば、HTTPレスポンスヘッダを適切に出力するために、Webアプリの実行環境やプログラム言語が用意している、ヘッダ出力用の関数やAPIを使用する方法が考えられます。それが使用できない場合は、cするといった処理を開発者が自身で実装する方法も考えられます。  U主任:その他に気になる点はありますか。  T君:はい。図6の一連のHTTPヘッダのうち、例えば、行番号dと行番号eを見比べると、サーバ側のセッション管理に問題があり、セッションフィクセーションの脆弱性が存在する可能性があります。攻撃者がCookie Monster Bugを突く攻撃や、前述したHTTPヘッダインジェクション攻撃を組み合わせることによって、セッションフィクセーションを成功させる可能性があります。図9に攻撃手順の一例を示します。
情報処理安全確保支援士試験(平成27年度 午後1 問01 図09)
 U主任:セッションフィクセーションの弱性について、どのような対策が考えられますか。  T君 :例えば、サーバ側の処理を変更する方法があります。検査シナリオの画面遷移でいえば、ログイン後の、画面Eから画面Cに遷移する際の、サーバ側の処理において、gといった対策を行うことによって、この脆弱性を確実に防ぐことができます。    U主任は、その後もT君に対してディスカッションや報告書の審査などを行い、技能試験は終了した。  T君は見事、技能試験に合格し、SPGの検査員として業務を始めた。

設問1〔本文中の下線①〕について(1)、(2)に答えよ。

(1)secure属性が設定されていないと、どの画面に遷移するときにセッションIDを盗聴されるリスクがあるか。遷移直後の画面を、画面A〜Eの中から一つ選び、答えよ。

模範解答

画面B

解説

解答の論理構成

  • 図6のレスポンスX 09行目に
    “Set-Cookie: SESSIONID=134D96E470da240421svr5B019; … domain=example.co.jp;”
    とあり、[ secure ] 属性が付与されていません。
  • secure属性が無い Cookie は HTTP と HTTPS の両方で送信されます。
  • 図1で唯一 “http://” となっている画面は
    “画面B:URL: http://www.example.co.jp/manual” です。
  • 実際に図6のリクエストY 12〜17行目を見ると、HTTP リクエストであるにもかかわらず 17行目
    “Cookie: SESSIONID=134D96E470da240421svr5B019”
    によりセッションIDが平文で送られています。
  • したがって、HTTPS の画面Aから HTTP の画面Bへ遷移した直後にセッションIDが平文送信され、盗聴されるリスクが生じます。
  • よって、遷移直後の画面は 画面B です。

誤りやすいポイント

  • HTTPS 画面間の遷移ばかりに注目し、HTTP 画面が 1 か所だけ混在していることを見落とす。
  • Cookie がブラウザ内に保存された後、同一ドメインなら自動で送信される仕様を忘れ、フォーム送信時だけを気にする。
  • secure 属性と HttpOnly 属性を混同し、「JavaScript からのアクセス防止=盗聴防止」と誤解する。

FAQ

Q: secure 属性を付けてもネットワーク盗聴は完全に防げますか?
A: はい、secure 属性付き Cookie は TLS 通信でのみ送信されるため、HTTP 経由の盗聴は防げます。ただし TLS そのものが無効化されていないかなど、他の設定も確認が必要です。
Q: HttpOnly 属性も付ければさらに安全になりますか?
A: はい。HttpOnly はブラウザのスクリプトから Cookie へのアクセスを禁止するため、XSS などによる窃取を防ぎます。用途が異なるため、secure と併用するのが一般的です。
Q: 画面Bを HTTPS 化する以外に対策はありますか?
A: 画面Bへの遷移時にセッション ID を破棄・再発行する方法もありますが、実装コストが高く、全画面を HTTPS 化するほうが根本的で確実です。

関連キーワード: secure属性, セッションID, セッションハイジャック, Cookie, HTTPヘッダ

設問1〔本文中の下線①〕について(1)、(2)に答えよ。

(2)secure属性が設定されていないと、セッションIDを盗聴されるリスクがある理由を40字以内で述べよ。

模範解答

暗号化されないHTTP通信において、セッションIDが送信されるから

解説

解答の論理構成

  1. 図6レスポンスXの行番号「09 Set-Cookie: SESSIONID=…」には“secure”が付いていません。
  2. 問題文には「“http://...”及び“https://...”の画面がある」とあり、実際に図1で“画面B URL: http://www.example.co.jp/manual”が示されています。
  3. Secure属性が無いCookieは HTTP/HTTPS を区別せず送信されます。
  4. 従って利用者が HTTP 画面(例:画面B)にアクセスすると、同じ「SESSIONID」が暗号化されない HTTP 通信で送信されるため、パケット盗聴で取得される恐れがあります。
  5. よって「暗号化されないHTTP通信において、セッションIDが送信されるから」と説明できます。

誤りやすいポイント

  • Secure属性は暗号化の可否を決めるだけで“HttpOnly”とは役割が異なる点を混同しやすい。
  • 「HTTPSだけを使うサイトならSecureが不要」と思い込み、問題文にある HTTP 画面の存在を見落とす。
  • Cookieの送信方向(リクエスト時)と受信方向(レスポンス時)を取り違え、Set-Cookie側にSecureが付かなくても大丈夫と誤解する。

FAQ

Q: Secure属性を付けても盗聴が完全に防げますか?
A: 利用者とサーバ間が常に HTTPS である限りCookieは暗号化されますが、SSL/TLS の設定ミスや中間者攻撃対策が不十分だと別の経路で漏えいする危険は残ります。
Q: HttpOnly 属性も併用するべきでしょうか?
A: はい。HttpOnly を付加すると JavaScript から Cookie が参照できなくなるため、XSS 経由での窃取リスクを下げられます。
Q: Secure属性が無いと必ず盗聴されるのですか?
A: 盗聴可能なのは HTTP 通信を経由した場合だけです。全画面が HTTPS でリダイレクト強制されていれば実質的なリスクは低減します。

関連キーワード: Secure属性, Cookie, セッションID, HTTP通信, HTTPS

設問2〔HTTPヘッダインジェクションの脆弱性〕について(1)〜(3)に答えよ。

(1)図7中のaに入れる適切な文字列をURLエンコード済の形式で答えよ。

模範解答

a:%0d%0a%0d%0a

解説

解答の論理構成

  1. HTTPヘッダインジェクションでは、レスポンスヘッダ中に攻撃者が用意した改行(CR+LF)を挿入し、
    本来のヘッダを強制終了させて任意ヘッダや本文を生成させます。
    問題文のディスカッションでも
    “入力された検索文字列を適切に処理せずに Set-Cookie ヘッダの値にセットしている”
    と説明されており、改行文字の混入が前提になっています。
  2. 図7の検査コードは“クエリ文字列のパラメタの値にセット”して送信する想定ですが、
    URL では制御文字を直接書けないため URL エンコードが必須です。
  3. 改行に相当する ASCII 制御文字は図8で
    “CR │ 0d” と “LF │ 0a”
    と明示されており、HTTP 1 行の終端は「CR(0d)+LF(0a)」であることは RFC 規定のとおりです。
  4. レスポンスヘッダを打ち切るには 2 回連続の改行(空行)を入れ、
    その後に攻撃用ヘッダや HTML 本文を置くのが典型的な手口です。
    したがって必要なバイト列は
    CR(0d)+LF(0a)+CR(0d)+LF(0a)。
  5. 以上を URL エンコードすると
    “%0d%0a%0d%0a”
    となり、模範解答 “a:%0d%0a%0d%0a” と一致します。

誤りやすいポイント

  • 改行を LF のみ “%0a%0a” としてしまう
    (HTTP は CR+LF で 1 行終了なので不完全)。
  • 1組の CRLF “%0d%0a” だけでヘッダが終わると誤解する
    (空行=2組必要)。
  • URL デコード後に空白などを入れたままにし、
    ヘッダ解釈がずれて検証が失敗する。
  • “%0d%0a%20” のように余計な文字を含めて
    ブラウザが改行と認識せず、攻撃が成立しない。

FAQ

Q: なぜ CR と LF を 2 回繰り返す必要があるのですか?
A: 1 回目の CRLF は現在のヘッダ行を閉じ、2 回目の CRLF で「空行」を作り、ヘッダ部全体の終了を示します。空行の後は HTTP 本文として扱われるので、任意のスクリプトを挿入できます。
Q: “%0d%0a” をフィルタすれば防げますか?
A: 直接フィルタすることも可能ですが、入力値をそのままヘッダに入れない、ヘッダ専用 API を使うなどのホワイトリスト方式が推奨されます。
Q: 文字コード 0d と 0a は環境依存しませんか?
A: どの OS・ブラウザでも ASCII 制御文字として固定値です。HTTP 仕様自体が CR(0d)+LF(0a) を改行として規定しているため、環境差は生じません。

関連キーワード: HTTPヘッダインジェクション、CRLF、URLエンコード、Set-Cookie、セッションID

設問2〔HTTPヘッダインジェクションの脆弱性〕について(1)〜(3)に答えよ。

(2)本文中のbに入れる適切な字句を解答群の中から選び、記号で答えよ。
解答群  ア:SQLインジェクション  イ:TCP SYN Flood  ウ:クロスサイトスクリプティング  エ:ディレクトリトラバーサル

模範解答

b:ウ

解説

解答の論理構成

  1. 問題文には次の記述があります。
    “この脆弱性を突いた攻撃では、b 攻撃と同様に、攻撃者が指定した任意のスクリプトをクライアント側で実行できます。”
  2. 「攻撃者が指定した任意のスクリプトをクライアント側で実行」できる代表的な攻撃は、クライアント(Webブラウザ)で JavaScript などを実行させる「クロスサイトスクリプティング」です。
  3. 解答群を見ると、スクリプト実行型の攻撃に該当するのは “ウ:クロスサイトスクリプティング” だけです。
  4. したがって、b に入る適切な字句は “ウ” となります。

誤りやすいポイント

  • SQLインジェクションを選ぶミス
    → 任意の SQL を“サーバ側”で実行させる攻撃であり、「クライアント側でスクリプトを実行」とは性質が異なります。
  • ディレクトリトラバーサルを選ぶミス
    → ファイルパスを改ざんして不正なファイルを取得する攻撃で、スクリプト実行とは無関係です。
  • HTTP ヘッダインジェクション≒クロスサイトスクリプティングと混同
    → 本問は「同様に」と比較対象を求めているため、直接の脆弱性名ではなく“代表的な既知攻撃”を答える必要があります。

FAQ

Q: HTTP ヘッダインジェクションとクロスサイトスクリプティングは何が違いますか?
A: 前者は改行文字などを注入してレスポンスヘッダを分断・生成させる手法、後者は生成されたページ上で任意のスクリプトを実行させる手法です。本問は「結果としてスクリプトが実行される」点で両者が類似すると説明しています。
Q: なぜ TCP SYN Flood は除外できますか?
A: TCP SYN Flood は通信セッションを大量に張ってサービス不能にする DoS 攻撃であり、スクリプト実行とは無関係だからです。
Q: 今回のように「ヘッダにスクリプトを乗せて実行させる」場合でも XSS と呼ぶのですか?
A: はい。最終的にブラウザが攻撃者制御のスクリプトを実行するなら、発生経路にかかわらず XSS の範疇で議論されます。

関連キーワード: クロスサイトスクリプティング、HTTPヘッダインジェクション、セッションハイジャック、Cookie属性、セッションフィクセーション

設問2〔HTTPヘッダインジェクションの脆弱性〕について(1)〜(3)に答えよ。

(3)本文中のcに入れる適切な処理を、30字以内で具体的に述べよ。

模範解答

c:・出力文字列に改行コードがあるとエラー画面を出力   ・出力文字列の改行コード以降の文字列を削除

解説

解答の論理構成

  1. 図7の検査コードは“%0d%0a”を含み、これは図8の ASCII 表で「文字コード0d=CR」「文字コード0a=LF」に対応します。
  2. CR+LF は HTTP ヘッダ行の終端を表すため、値に混入するとヘッダを強制終了し、続く文字列を新たなヘッダ行として解釈させることができます。T 君の指摘どおり「HTTPヘッダインジェクションの脆弱性」が成立する理由はここにあります。
  3. U 主任は「Set-Cookie ヘッダの値をセットするサーバ側の処理」に対する対策案を求めています。安全なヘッダ生成 API を使えない前提であるため、アプリケーション側で値を検査・無害化する実装が必要です。
  4. 攻撃に必須の文字は CR/LF なので、
    ・ヘッダ出力前に CR または LF が含まれていればエラーとして処理を中断する
    ・もしくは CR/LF 以降を切り捨ててヘッダに出さない
    という方針が最も直接的な防御策になります。
  5. 以上より、c には「出力文字列に改行コードがあるとエラー画面を出力」「出力文字列の改行コード以降の文字列を削除」という具体策が妥当であり、模範解答と一致します。

誤りやすいポイント

  • 入力値の HTML エスケープだけで十分と考えてしまう。HTTP ヘッダにセットされる値は HTML ではなく、CR/LF の除去が本質です。
  • URL エンコードすれば安全だと誤解する。攻撃者は“%0d%0a”のようにエンコード済みで送信し、サーバがデコードしてからヘッダに入れるケースを突きます。
  • 対策を「単に文字列を置換する」とだけ書き、どの文字を対象にするか示さない。CR と LF を明示しなければ部分点止まりになる可能性があります。

FAQ

Q: CR/LF を拒否せずにエンコードして出力する方法でも良いですか?
A: ヘッダ値は RFC で改行が禁止されているため、エンコード後の再デコード経路を完全に排除できない限り推奨されません。除去またはエラーにする方が確実です。
Q: “\r\n”以外の制御文字もチェックすべきでしょうか?
A: まず最優先は CR/LF ですが、将来の拡張やパーサ実装差異を考慮し、他の制御文字も拒否するほうが望ましいです。
Q: 既存フレームワークのヘッダ生成 API を使えば改行除去は不要ですか?
A: 多くの API は内部で検査を行いますが、使用していない部分や独自追加ヘッダでは自前チェックが必要になる場合があります。

関連キーワード: HTTPヘッダインジェクション、CRLFインジェクション、Set-Cookie、セッションID、入力値検証

設問3〔セッション管理の脆弱性〕について、(1)〜(4)に答えよ。

(1)本文中のdeに入れる適切な行番号を答えよ。(d, eは順不同)

模範解答

d:09 又 は17 e:27

解説

解答の論理構成

  1. セッションフィクセーションでは「ログイン前に発行されたセッションIDがログイン後もそのまま利用される」ことが問題になります。
  2. 図6のヘッダを確認すると、最初のアクセス(画面A)のレスポンスで行番号 09
    「Set-Cookie: SESSIONID=134D96E470da240421svr5B019; Expires=Wed, 11-Jun-2014 05:30:31 GMT; domain=example.co.jp;」
    が送出され、ブラウザはこのIDを保持します。
  3. その後、画面Bへの遷移時のリクエストで行番号 17
    「Cookie: SESSIONID=134D96E470da240421svr5B019」
    が送信され、同一IDがサーバへ戻されています。
  4. ログインを経た後、商品取引用のリクエスト(画面D遷移時)では行番号 27
    「Cookie: SESSIONID=134D96E470da240421svr5B019」
    が依然として送信されています。
  5. 以上より、ログイン後もセッションIDが更新されていないことが確認できます。従って、比較対象には「発行時のSet-Cookie(09 もしくは発行直後に送信された 17)」と「ログイン後のCookie(27)」を選べばよいことになります。
結論:
d:09 又は17
e:27

誤りやすいポイント

  • 「KENSaku」Cookie(行28)と混同してしまい、セッションIDとは無関係な行を選んでしまう。
  • レスポンスヘッダ(09)とリクエストヘッダ(17)のどちらを選ぶべきか迷い、片方しか正解だと思い込む。問題文は「行番号 d と行番号 e を見比べる」としており、09・17 いずれでも可。
  • セッションIDはログイン処理の直前に再発行されるものと決め付け、「Set-Cookie」がないレスポンスZ側を探してしまう。

FAQ

Q: 09 と 17 の両方を解答したら減点になりますか?
A: 指示は「(d, e は順不同)」なので、d に 09、e に 27 でも d に 17、e に 27 でも正解です。両方書くと指定外回答となる恐れがあります。
Q: なぜ 27 が必須なのですか?
A: 27 は「ログイン後」のリクエストに含まれる Cookie 行です。セッションフィクセーションの確認にはログイン後に同じIDが使われていることを示す必要があります。
Q: secure 属性の欠如とセッションフィクセーションは別問題ですか?
A: はい。secure 属性は通信経路の盗聴対策、セッションフィクセーションはID再発行の有無による固定化対策であり、脅威モデルが異なります。

関連キーワード: セッションフィクセーション、Set-Cookie、Cookie、HTTPレスポンスヘッダ、セッションID

設問3〔セッション管理の脆弱性〕について、(1)〜(4)に答えよ。

(2)図9中のfに入れる適切な字句を答えよ。

模範解答

f:01234

解説

解答の論理構成

  1. 図9の手順1には、
    「攻撃者Jが,試験用サイトの画面Aにアクセスし,セッションIDを取得する。このときの,セッションIDを“01234”とする。」
    と明記されています。ここで攻撃者は自分が知っている SESSIONID=“01234” を手に入れます。
  2. セッションフィクセーション攻撃では、攻撃者が取得したセッションIDを利用者に押し付けることが成功条件です。したがって、利用者Kのブラウザに対して Set-Cookie ヘッダで設定する値は、攻撃者があらかじめ把握している値と一致していなければなりません。
  3. 図9の手順3には、攻撃用クエリ文字列の一部として
    「%0d%0aSet%2dCookie%3a%20SESSIONID%3df%3b …」
    が示されています。ここで f に入る値こそ、手順1で攻撃者が取得した “01234” である必要があります。
  4. 以上より、f には攻撃者が保有するセッションID 01234 を入れるのが論理的帰結です。

解答:
f:01234

誤りやすいポイント

  • 被害者が取得した “56789” を入れてしまう。これは「攻撃者が知っているIDを被害者に固定する」という攻撃の本質を取り違えています。
  • 数字の前後に空白や引用符を含めてしまう。Set-Cookie ヘッダの値に余分な文字が入ると、クッキーが正しく解釈されず攻撃が失敗します。
  • 大文字小文字を混同して “sessionid=01234” と記述する。HTTPヘッダでは Cookie 名の大小は区別される実装もあるため、問題文どおり SESSIONID と一致させる必要があります。

FAQ

Q: なぜ利用者Kがすでに持っている “56789” を上書きできるのですか?
A: 攻撃用クエリ文字列によりレスポンスヘッダへ「Set-Cookie: SESSIONID=01234 …」が挿入され、ブラウザはサーバからの正式な指示と誤認してクッキーを更新するためです。
Q: secure 属性や HttpOnly 属性を付けていれば防げましたか?
A: 今回の脆弱性は HTTP ヘッダインジェクションによる Set-Cookie 強制であり、secure や HttpOnly の有無とは直接関係しません。根本対策はヘッダ分離処理とログイン時のセッションID再生成です。
Q: 攻撃者が推測で適当な数字を入れても成立しますか?
A: 推測だけではセッションIDの一致確率が極めて低く現実的ではありません。攻撃者は手順1で確実に自分が発行された “01234” を使い、被害者のセッションをそのIDに固定します。

関連キーワード: セッションフィクセーション、HTTPヘッダインジェクション、Set-Cookie、セッションID再生成、クッキー上書き

設問3〔セッション管理の脆弱性〕について、(1)〜(4)に答えよ。

(3)図9中の手順4及び5について、利用者Kがログインした後、攻撃者Jが利用者Kになりすますことができるのはなぜか。“セッションID”という字句を含めて40字以内で述べよ。

模範解答

攻撃者Jが取得したセッションIDで利用者Kにログインさせているから

解説

解答の論理構成

  1. 図9では先に「攻撃者Jが,試験用サイトの画面Aにアクセスし,セッションIDを取得」し(手順1),その値を悪用します。
  2. 次いで「攻撃用のクエリ文字列」を利用者Kに踏ませることで,レスポンス中に Set-Cookie: SESSIONID=… を挿入し(手順3),利用者Kのブラウザに攻撃者Jと同一のセッションIDを固定します。
  3. T君も指摘しているように「サーバ側のセッション管理に問題があり,セッションフィクセーションの脆弱性が存在する可能性があります」。
  4. その状態で「利用者Kがログイン」すると(手順4),サーバは当該セッションIDに認証済みフラグを付与します。
  5. 攻撃者Jは,同じセッションIDを保持しているため「利用者Kになりすまし,本来はアクセス権限がない画面にアクセス」できます(手順5)。
  6. したがって解答は「攻撃者Jが取得したセッションIDで利用者Kにログインさせているから」となります。

誤りやすいポイント

  • セッションIDを盗むのではなく「固定する」攻撃であることを見落とす。
  • 被害者がログインする瞬間に権限が付与される点を説明から漏らす。
  • セッションIDの再生成(ログイン後のID切替)を行えば防げる事実に気付かず,原因をCookieのSecure属性欠如と混同する。

FAQ

Q: 盗聴とセッションフィクセーションは同じですか?
A: 盗聴は通信経路でセッションIDを奪いますが,セッションフィクセーションは攻撃者が決めたセッションIDを利用者に使わせる点が異なります。
Q: Secure属性を付与すれば今回の攻撃は防げますか?
A: 攻撃が HTTPS 上で行われているなら Secure 属性だけでは防げません。ログイン時にセッションIDを再生成する対策が必要です。
Q: なりすましを検知する方法はありますか?
A: セッションIDに加えて IP アドレスや User-Agent を照合し,異常があればセッションを破棄すると検知率が向上します。

関連キーワード: セッションフィクセーション、Set-Cookie、HTTPヘッダインジェクション、なりすまし、認証

設問3〔セッション管理の脆弱性〕について、(1)〜(4)に答えよ。

(4)本文中のgに入れる適切な対策を、30字以内で述べよ。

模範解答

g:新しいセッションIDによるセッションを開始する

解説

解答の論理構成

  1. 最初に脆弱性を確認
    本文には「セッションフィクセーションの脆弱性が存在する可能性」とあり、攻撃例として図9が示されています。
  2. 脆弱性の要因を特定
    ・画面A表示時のレスポンスXでサーバは「09 Set-Cookie: SESSIONID=134D96E470da240421svr5B019…」を送信。
    ・ログイン後に画面Cへ戻った後のリクエストZでも「27 Cookie: SESSIONID=134D96E470da240421svr5B019」がそのまま送られており、認証前後でセッションIDが変わっていません。
    ・このままでは攻撃者が事前に決めたIDを被害者へ固定させることができます。
  3. 必要な対策を導出
    攻撃を防ぐにはログイン完了時に旧セッションを破棄し、新しいセッションIDを払い出すのが最も確実です。これは、攻撃者が固定したIDを排除し、利用者本人だけが知る新しいIDで再度セッションを構築するためです。
  4. 本文の[ g ]部分に対策をあてはめる
    本文には「画面Eから画面Cに遷移する際の、サーバ側の処理において、[ g ]といった対策を行うことによって、この脆弱性を確実に防ぐことができます。」とあります。
    以上から[ g ]には「新しいセッションIDによるセッションを開始する」と記述するのが最適解となります。

誤りやすいポイント

  • secure属性やhttponly属性の付与と混同し、Cookie盗聴対策を答えてしまう
  • 「セッションIDを更新する」のみとし、旧セッションの破棄を明示しない
  • 画面遷移前(ログイン画面表示時)にIDを再発行すると誤解する
  • サーバではなくクライアント側のCookie削除だけで十分だと考える

FAQ

Q: ログイン後にIDを再発行しないと必ずセッションフィクセーションになりますか?
A: 攻撃者が事前にIDを固定できる経路がある場合は高い確率で成立します。再発行は安全側に倒すための標準対策です。
Q: 再発行時に古いセッション情報を引き継ぐ必要があります。どう実装しますか?
A: IDを再生成した直後にサーバ側で新セッションへ属性をコピーし、旧セッションを無効化します。開発フレームワークの「session regenerate」相当のAPIが推奨されます。
Q: セッションIDを暗号化すれば再発行しなくても安全ですか?
A: いいえ。暗号化は盗聴耐性を高めますが、固定されたID自体を無効化できません。再発行と組み合わせる必要があります。

関連キーワード: セッションフィクセーション、セッションID再生成、Cookie、認証、脆弱性対策
戦国ITクイズ機能

\ せっかくなら /

情報処理安全確保支援士
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてプライバシーポリシー利用規約特商法表記開発者について