応用情報技術者過去問題 令和6年秋期 午後問1
⇄問題文と設問を画面2分割で開く⇱問題PDF問1 情報セキュリティ
Webサイトのセキュリティに関する次の記述を読んで,設問に答えよ。
F社は,日用雑貨を製造・販売する中堅企業である。このたび,販路拡大を目的として自社製品を販売するWebサイト(以下,本システムという)を新規に開発した。本システムは,D社クラウドサービス上に構築しており,Webサーバとデータベース(以下,DBという)サーバから成り,D社クラウドサービスが提供するファイアウォール(以下,FWという)及びWebアプリケーションファイアウォール(以下,WAFという)を経由してインターネットからアクセスされる予定である。
本システムの開発環境のネットワーク構成(抜粋)を図1に示す。なお,本システムはリリース前であり,F社開発環境の特定のIPアドレスからだけアクセスできるようにFWで制限している。
本システムの主な仕様を次に示す。
F社情報セキュリティ部のG部長は,本システムのリリース前にペネトレーションテストを実施することを決定し,H主任をリーダーに任命した。H主任は,セキュリティベンダーであるU社に本システムのペネトレーションテストの実施を依頼した。ペネトレーションテストは,U社内のPCからインターネット,FW及びWAFを経由して本システムにアクセスする経路で実施した。
ペネトレーションテスト期間中は,FW及びWAFに対して次の変更を行った。
〔ペネトレーションテストの結果〕
ペネトレーションテストの結果,次の手順(以下,本シナリオという)で会員のパスワードが推測されて,不正にアクセスされてしまうことが確認された。
稼働中のシステムのログインフォームに対してパスワードを総当たりで試行するa攻撃では,システム側で試行回数に制限を設けて対策することができるが,レインボーテーブル攻撃ではそれができない。
H主任は,本システムの修正方針を整理するために,SQLインジェクション攻撃及びレインボーテーブル攻撃への対策を検討することにした。なお,ペネトレーションテスト期間中にWAFでSQLインジェクション攻撃が検知できていたが,③仮に対策の一つが破られても他の対策で攻撃を防ぐという考え方に基づき,攻撃への対策をWAFだけに頼らず本システム自体でも行うことにした。
〔SQLインジェクション攻撃への対策の検討〕
本システムのソースコードを調査したところ,一部の処理で外部からの入力値をそのままSQL文に埋め込んでいる箇所が存在していた。そこで,対策として,bを利用する方式を採用することにした。この方式では,外部からの入力値が埋め込まれる箇所を専用の記号に置き換えたSQL文の雛形をあらかじめ作成しておき,専用の記号で置き換えた箇所にDB管理システム側で外部からの入力値を割り当てる。
〔レインボーテーブル攻撃への対策の検討〕
本システムでは会員のパスワードをハッシュ化して保存しているが,パスワードそのものにハッシュ関数を1回適用しただけであったので,レインボーテーブル攻撃に対して脆弱であった。そこで,パスワードをハッシュ化する際に,次の三つの処理を組み合わせて実施することにした。
さらに,ハッシュ化処理の変更に加えて,会員が設定可能なパスワード長を10字以上64字以下に変更した。本システムにおいて,パスワード長が10字の場合,6字の場合と比べてパスワードとして使用可能な文字列のパターン数がc倍になるのでレインボーテーブル攻撃がより困難になる。
H主任は,これらの対策を取りまとめてG部長に報告し,承認された。
F社は,日用雑貨を製造・販売する中堅企業である。このたび,販路拡大を目的として自社製品を販売するWebサイト(以下,本システムという)を新規に開発した。本システムは,D社クラウドサービス上に構築しており,Webサーバとデータベース(以下,DBという)サーバから成り,D社クラウドサービスが提供するファイアウォール(以下,FWという)及びWebアプリケーションファイアウォール(以下,WAFという)を経由してインターネットからアクセスされる予定である。
本システムの開発環境のネットワーク構成(抜粋)を図1に示す。なお,本システムはリリース前であり,F社開発環境の特定のIPアドレスからだけアクセスできるようにFWで制限している。

- 会員登録時に自動で発行される会員番号と会員が設定したパスワードをログインフォームに入力してログインする。商品の購入はログイン後に行う。
- パスワードとして使用できる文字は,英数字に一部の記号を加えた70種類である。
- パスワードは,6字以上16字以下で設定する。
- 会員テーブルは,会員番号,メールアドレス,パスワードのハッシュ値,姓,名,住所,電話番号の7フィールドで構成されている。①パスワードのハッシュ値は,会員が設定したパスワードをハッシュ関数によってハッシュ化したものである。
F社情報セキュリティ部のG部長は,本システムのリリース前にペネトレーションテストを実施することを決定し,H主任をリーダーに任命した。H主任は,セキュリティベンダーであるU社に本システムのペネトレーションテストの実施を依頼した。ペネトレーションテストは,U社内のPCからインターネット,FW及びWAFを経由して本システムにアクセスする経路で実施した。
ペネトレーションテスト期間中は,FW及びWAFに対して次の変更を行った。
- FWに対する変更
通信を許可するアクセス元IPアドレスとして,ペネトレーションテストに用いるU社のIPアドレスを追加する。 - WAFに対する変更
攻撃を検知した際には,通信の遮断は行わず,検知したことだけを記録する。
〔ペネトレーションテストの結果〕
ペネトレーションテストの結果,次の手順(以下,本シナリオという)で会員のパスワードが推測されて,不正にアクセスされてしまうことが確認された。
- ②SQLインジェクション攻撃によって会員テーブルのデータを取得する。このとき取得した会員テーブルのデータ(抜粋)を表1に示す。
- レインボーテーブル攻撃によって,手順1で取得した会員テーブル中のパスワードのハッシュ値から元のパスワードを推測する。
- 推測したパスワードを利用して,会員になりすまして本システムにログインする。

H主任は,本システムの修正方針を整理するために,SQLインジェクション攻撃及びレインボーテーブル攻撃への対策を検討することにした。なお,ペネトレーションテスト期間中にWAFでSQLインジェクション攻撃が検知できていたが,③仮に対策の一つが破られても他の対策で攻撃を防ぐという考え方に基づき,攻撃への対策をWAFだけに頼らず本システム自体でも行うことにした。
〔SQLインジェクション攻撃への対策の検討〕
本システムのソースコードを調査したところ,一部の処理で外部からの入力値をそのままSQL文に埋め込んでいる箇所が存在していた。そこで,対策として,bを利用する方式を採用することにした。この方式では,外部からの入力値が埋め込まれる箇所を専用の記号に置き換えたSQL文の雛形をあらかじめ作成しておき,専用の記号で置き換えた箇所にDB管理システム側で外部からの入力値を割り当てる。
〔レインボーテーブル攻撃への対策の検討〕
本システムでは会員のパスワードをハッシュ化して保存しているが,パスワードそのものにハッシュ関数を1回適用しただけであったので,レインボーテーブル攻撃に対して脆弱であった。そこで,パスワードをハッシュ化する際に,次の三つの処理を組み合わせて実施することにした。
- ソルトを用いた処理
- パスワードをハッシュ化する際に,ソルトを付加した上でハッシュ化する。
- ソルトとして,会員ごとに異なるランダムな文字列を用意し,会員テーブルに格納する。
- ④ペッパーを用いた処理
- パスワードをハッシュ化する際に,ペッパーを付加した上でハッシュ化する。
- ペッパーとして,全ての会員に共通のランダムな文字列を用意し,Webサーバ内の外部からアクセスできない安全な領域に格納する。
- ストレッチング
- ハッシュ関数を複数回適用する。
さらに,ハッシュ化処理の変更に加えて,会員が設定可能なパスワード長を10字以上64字以下に変更した。本システムにおいて,パスワード長が10字の場合,6字の場合と比べてパスワードとして使用可能な文字列のパターン数がc倍になるのでレインボーテーブル攻撃がより困難になる。
H主任は,これらの対策を取りまとめてG部長に報告し,承認された。
設問1
本文中の下線①について,会員のパスワードをハッシュ関数でハッシュ化して保存することは,情報漏えいの脅威に対してメリットがある。それは,ハッシュ値にどのような特性があるからか。25字以内で答えよ。
解答入力欄
解答例・解答の要点
- ハッシュ値からパスワードの割出しは難しい (20文字)
解説
ハッシュ関数で生成されたハッシュ値は、不可逆性、衝突耐性、決定性という3つの重要な特性があります。
パスワードをハッシュ化せずに平文のまま保存していると、システムが攻撃を受けた際、パスワードが直接漏えいし、不正アクセスのリスクが高まります。しかし、ハッシュ化して保存していれば、万が一データが漏えいした場合でも、攻撃者はハッシュ値しか取得できず、そこから元のパスワードを直接導き出すことは困難です。情報漏えいの防御策となるのは、ハッシュ値の「不可逆性」によるものなので、解答としては「ハッシュ値からパスワードの割出しは難しい」などが適切となります。
パスワードをハッシュ化して保存する方法は、万が一の情報漏えいに備える対策として非常に重要です。実際の現場でもパスワードはハッシュ化して保存することは常識です。
∴ハッシュ値からパスワードの割出しは難しい
- 不可逆性
- ハッシュ値から元のパスワードを復元することが非常に困難である
- 衝突耐性
- 入力が異なれば高確率で異なるハッシュ値が生成される
- 決定性
- 入力が同じであれば常に同じハッシュ値が生成される
パスワードをハッシュ化せずに平文のまま保存していると、システムが攻撃を受けた際、パスワードが直接漏えいし、不正アクセスのリスクが高まります。しかし、ハッシュ化して保存していれば、万が一データが漏えいした場合でも、攻撃者はハッシュ値しか取得できず、そこから元のパスワードを直接導き出すことは困難です。情報漏えいの防御策となるのは、ハッシュ値の「不可逆性」によるものなので、解答としては「ハッシュ値からパスワードの割出しは難しい」などが適切となります。
パスワードをハッシュ化して保存する方法は、万が一の情報漏えいに備える対策として非常に重要です。実際の現場でもパスワードはハッシュ化して保存することは常識です。
∴ハッシュ値からパスワードの割出しは難しい
設問2
本文中の下線②について,会員テーブルのデータが漏えいした場合,情報セキュリティの3要素のどれが直接的に侵害されたといえるか。漢字3字で答えよ。
解答入力欄
解答例・解答の要点
- 機密性 (3文字)
解説
情報セキュリティマネジメントでは、維持管理すべき3つ要素として、機密性、完全性、可用性があります。
∴機密性
- 機密性(Confidentiality)
- 許可されたユーザーのみが情報にアクセスできる特性であり、アクセス制御やデータの暗号化によって保護される
- 完全性(Integrity)
- 情報が正しく維持され、改ざんや破壊がされていない特性であり、デジタル署名やチェックサムなどで確保される
- 可用性(Availability)
- 必要な時にシステムやデータが利用可能である特性であり、冗長化やバックアップによって確保される
∴機密性
設問3
本文中のa,bに入れる適切な字句を解答群の中から選び,記号で答えよ。
a,b に関する解答群
- エスケープ
- 許可リスト
- サニタイズ
- 中間者
- ブルートフォース
- プレースホルダ
- リプレイ
解答入力欄
- a:
- b:
解答例・解答の要点
- a:オ
- b:カ
解説
〔aについて〕
「パスワードを総当たりで試行する」という説明から、ブルートフォース攻撃と判断できます。ブルートフォース攻撃は、システムやアカウントのパスワードを解読するために、考えられるすべての文字列の組合せを試行する攻撃手法です。総当たり攻撃とも呼ばれます。
この攻撃に対しては、短いパスワードや単純なパスワードは容易に解読されるリスクが高いため、まずは長く複雑なパスワードを設定することが重要です。またWebシステムを攻撃する場合、ログインフォームを直接狙うため、試行回数を制限して一定回数以上のログイン失敗が発生した場合にアカウントを一時的にロックすることや、CAPTCHAや多要素認証など追加の認証を導入することが対策となります。
∴a=オ:ブルートフォース
〔bについて〕
空欄bの後に続く「この方式は…」の説明より、プレースホルダであると判断できます。プレースホルダは、SQL文中のユーザー入力を割り当てる部分に特殊文字(例えば ? や $1)を使用した雛形を用意し、後から実際の値を割り当てる仕組みです。
SQLインジェクションは、Webアプリケーションの脆弱性を悪用し、不正なSQLクエリをデータベースに対して実行させる攻撃です。特に、外部からの入力値をそのままSQL文に埋め込む実装は、この脆弱性を引き起こす原因となります。
例えば、次のようなSQL文があるとします。
このようなSQLインジェクションを防ぐために有効なのが「プレースホルダ」を利用する方法です。プレースホルダは、ユーザー入力部分を専用の記号に置き換えたSQL文の雛形(プリペアドステートメント)をあらかじめ作成し、実行時にDB管理システム側でプレースホルダに実際の値を割り当てます。DB管理システムが割り当てる際、入力値は値として扱われるため、安全なSQL実行が可能となります。
∴b=カ:プレースホルダ
「パスワードを総当たりで試行する」という説明から、ブルートフォース攻撃と判断できます。ブルートフォース攻撃は、システムやアカウントのパスワードを解読するために、考えられるすべての文字列の組合せを試行する攻撃手法です。総当たり攻撃とも呼ばれます。
この攻撃に対しては、短いパスワードや単純なパスワードは容易に解読されるリスクが高いため、まずは長く複雑なパスワードを設定することが重要です。またWebシステムを攻撃する場合、ログインフォームを直接狙うため、試行回数を制限して一定回数以上のログイン失敗が発生した場合にアカウントを一時的にロックすることや、CAPTCHAや多要素認証など追加の認証を導入することが対策となります。
∴a=オ:ブルートフォース
〔bについて〕
空欄bの後に続く「この方式は…」の説明より、プレースホルダであると判断できます。プレースホルダは、SQL文中のユーザー入力を割り当てる部分に特殊文字(例えば ? や $1)を使用した雛形を用意し、後から実際の値を割り当てる仕組みです。
SQLインジェクションは、Webアプリケーションの脆弱性を悪用し、不正なSQLクエリをデータベースに対して実行させる攻撃です。特に、外部からの入力値をそのままSQL文に埋め込む実装は、この脆弱性を引き起こす原因となります。
例えば、次のようなSQL文があるとします。
SELECT * FROM users WHERE user_id =【入力値】
この【入力値】に、攻撃者が入力した21717202 OR 1 = 1という文字列が埋め込まれた場合、以下のようなSQLが実行されてしまいます。SELECT * FROM users WHERE user_id = 21717202 OR 1 = 1
上記の場合、1 = 1 は常に true となり、2つの条件式は OR で連結していることから、会員テーブル内の全てのレコードが取得されます。SQLインジェクションはこのような形で成立します。このようなSQLインジェクションを防ぐために有効なのが「プレースホルダ」を利用する方法です。プレースホルダは、ユーザー入力部分を専用の記号に置き換えたSQL文の雛形(プリペアドステートメント)をあらかじめ作成し、実行時にDB管理システム側でプレースホルダに実際の値を割り当てます。DB管理システムが割り当てる際、入力値は値として扱われるため、安全なSQL実行が可能となります。
// $ がプレースホルダ
$user_id =【入力値】
$stmt = 'SELECT * FROM users_TABLE WHERE user_id = $'
$stmt->execute($user_id)
$user_id =【入力値】
$stmt = 'SELECT * FROM users_TABLE WHERE user_id = $'
$stmt->execute($user_id)
∴b=カ:プレースホルダ
設問4
本シナリオによって,表1に示す会員テーブルのデータが窃取され,会員番号"21717202"の会員のパスワードが推測され不正アクセスを受けたとすると,推測されたパスワードを利用して不正アクセスを受けるおそれが最も強い他の会員は誰か。該当する会員の会員番号を解答群の中から選び,記号で答えよ。
解答群
- 21717203
- 30781985
- 36150833
- 45905900
- 45917046
解答入力欄
解答例・解答の要点
- イ
解説
表1の会員テーブルのデータを見ると、会員番号"21717202"と"30781985"のパスワードのハッシュ値が同じです。ハッシュ値が同一であるということは、両会員が同じパスワードを利用している可能性が非常に高いことを意味します。
会員テーブルのデータが攻撃者に窃取されているということは、会員番号が攻撃者に知られていることになります。本システムは、会員番号とパスワードでログインしますから、会員番号"21717202"と同じパスワードを使用している会員番号"30781985"も、攻撃者によって同様に不正アクセスを受けるリスクは高いと判断されます。
∴イ:30781985
会員テーブルのデータが攻撃者に窃取されているということは、会員番号が攻撃者に知られていることになります。本システムは、会員番号とパスワードでログインしますから、会員番号"21717202"と同じパスワードを使用している会員番号"30781985"も、攻撃者によって同様に不正アクセスを受けるリスクは高いと判断されます。
∴イ:30781985
設問5
本文中の下線③の考え方を,漢字4字で答えよ。
解答入力欄
解答例・解答の要点
- 多層防御 (4文字)
解説
単一のセキュリティ対策に頼るのではなく、複数の異なる防御手段を組み合わせて総合的にセキュリティを強化する考え方を多層防御」といいます。この手法により、一つの防御手段が破られたとしても、他の対策が機能することでシステムの安全性を維持できる可能性が高まります。
本設問では、レインボーテーブル攻撃への防御策として、まずその前提となるSQLインジェクションのリクエストを拒否するWAF、危険なSQL文を防ぐプレースホルダが導入されています。さらに万が一ハッシュ値が漏えいしても問題ないように、ストレッチング、ソルト、ペッパーを導入しています。これが多層防御の具体例となります。これ以外にも、ユーザーからの入力値の検証を行ったり、データ暗号化や機械学習により通常とは異なるSQLクエリのパターンをリアルタイムで検出するなどの方法も考えらえます。近年、攻撃手法が高度化しているため、一つの対策に頼るのではなく、複数の防御手段を組み合わせて多層的に保護することが重要になっています。
∴多層防御
本設問では、レインボーテーブル攻撃への防御策として、まずその前提となるSQLインジェクションのリクエストを拒否するWAF、危険なSQL文を防ぐプレースホルダが導入されています。さらに万が一ハッシュ値が漏えいしても問題ないように、ストレッチング、ソルト、ペッパーを導入しています。これが多層防御の具体例となります。これ以外にも、ユーザーからの入力値の検証を行ったり、データ暗号化や機械学習により通常とは異なるSQLクエリのパターンをリアルタイムで検出するなどの方法も考えらえます。近年、攻撃手法が高度化しているため、一つの対策に頼るのではなく、複数の防御手段を組み合わせて多層的に保護することが重要になっています。
∴多層防御
設問6
〔レインボーテーブル攻撃への対策の検討〕について答えよ。
- 本文中の下線④について,ペッパーを付加してハッシュ化することで本シナリオにおいてレインボーテーブル攻撃が困難になる理由を,ソルトを用いた処理との違いに着目して35字以内で答えよ。
- 本文中のcに入れる適切な数を,xyのような指数を用いた表記で答えよ。
解答入力欄
- c:
解答例・解答の要点
- 会員テーブルの窃取だけではペッパーを得ることができないから (29文字)
- c:704
解説
- レインボーテーブル攻撃は、攻撃者があらかじめ多数のパスワードとそれに対応するハッシュ値のリスト(レインボーテーブル)を用意し、取得したハッシュ値を照合し、元のパスワードを特定する攻撃手法です。通常のハッシュ処理のみではこの攻撃に対して脆弱ですが、ソルトやペッパーを追加することで、攻撃の難易度を大幅に高めることができます。
ペッパー、ソルトの性質と使用方法は以下のとおりです。- ペッパー
- 全ての利用者で共通の固定値(ペッパー)をパスワードに追加し、それをハッシュ化する。ペッパーはデータベースには保存されず、Webサーバの外部からアクセスできない安全な領域に保管される
- ソルト
- 利用者ごとに異なるランダムな値(ソルト)をパスワードに追加し、それをハッシュ化する。ソルトはハッシュ値とともにデータベースに保存される
本シナリオでは、会員テーブルが窃取されたことを想定していますが、会員テーブルの情報を入手したとしても、パスワード解析に必要なペッパーを取得できません。これが、レインボーテーブル攻撃が困難になる理由です。
∴会員テーブルの窃取だけではペッパーを得ることができないから - 本システムの主な仕様に「パスワードとして使用できる文字は,英数字に一部の記号を加えた70種類である」の記載があります。そのため、パスワード長が6字の場合のパターン数は706通り、パスワード長が10字の場合は7010通りのパターンが存在します。このとき、パターン数が何倍になるかを求めるには以下の計算を行います。
7010706=7010-6=704
したがって、パスワードの最大文字数を6文字から10文字に変更したことで、使用可能なパターン数は「704」倍に増加します。
∴c=704
