午前I問題
Webアプリケーションの脆弱性に関する記述として、適切なものはどれか。
ア)クロスサイトスクリプティング(XSS)攻撃は、攻撃者が細工したSQLをWebアプリに送り込み、データベースを不正に操作する攻撃である。
イ)クロスサイトリクエストフォージェリ(CSRF)攻撃は、正規ユーザのブラウザを悪用して、ユーザが意図しないリクエストをWebアプリに送信させる攻撃である。
ウ)ディレクトリトラバーサル攻撃は、WebサーバのDNSキャッシュを汚染して、ユーザを偽サイトへ誘導する攻撃である。
エ)OSコマンドインジェクション攻撃は、攻撃者が悪意あるスクリプトをWebページに埋め込み、閲覧者のブラウザ上で実行させる攻撃である。
午前I の解答・解説を見る
正解: イ
解説: CSRF(クロスサイトリクエストフォージェリ)は、ログイン済みユーザのセッションを悪用し、ユーザが意図しない操作(送金・設定変更など)をサーバに実行させる攻撃です。ア)はSQLインジェクション、ウ)はDNSキャッシュポイズニング、エ)はXSSの説明です。
| 攻撃 | 標的 | 主な対策 |
|---|---|---|
| XSS | 閲覧者のブラウザ | 出力エスケープ、CSP |
| CSRF | サーバ(セッション悪用) | CSRFトークン、SameSite Cookie |
| SQLi | データベース | プリペアドステートメント |
| ディレクトリトラバーサル | サーバのファイル | パスの正規化・検証 |
| OSコマンドインジェクション | サーバのOS | シェル呼び出し禁止、入力検証 |
午前II問題
バッファオーバーフロー攻撃への対策として、適切でないものはどれか。
ア)コンパイラのスタック保護機能(スタックカナリア)を有効にし、スタック上の戻りアドレスが改ざんされた場合にプログラムを終了させる。
イ)ASLR(Address Space Layout Randomization)を有効にし、スタック・ヒープ・ライブラリのメモリ配置をランダム化することで、攻撃者がアドレスを予測しにくくする。
ウ)DEP/NX(Data Execution Prevention / No-eXecute)ビットを有効にし、データ領域のコードを実行不可にすることで、シェルコードの実行を防ぐ。
エ)Webアプリケーションファイアウォール(WAF)をネットワーク境界に設置し、外部からの全パケットを検査することで、バッファオーバーフロー攻撃を根本的に防止する。
午前II の解答・解説を見る
正解: エ
解説: WAFはHTTPリクエストのパターンマッチングによる検査を行いますが、バッファオーバーフロー攻撃を根本的に防止することはできません。暗号化通信内のペイロードは検査できない場合があり、ネットワーク外部からではない攻撃には無効です。根本的対策はアプリケーションコード・コンパイラ・OS側での対処(ア・イ・ウ)です。
| 対策 | レイヤ | 効果 |
|---|---|---|
| スタックカナリア | コンパイラ | 改ざん検知・強制終了 |
| ASLR | OS | アドレス予測困難化 |
| DEP/NX | OS/CPU | シェルコード実行防止 |
| WAF | ネットワーク | 一部検知(根本対策にならない) |
午後問題
C社は自社開発のWebアプリケーション(会員管理システム)を運営している。外部のセキュリティ診断業者によるペネトレーションテストの結果、以下の脆弱性レポートが提出された。
脆弱性①
- 発見箇所: 会員検索機能(
/search?name=パラメータ) - 再現手順:
name=に<script>alert(document.cookie)</script>を入力すると、検索結果ページでスクリプトが実行された - 影響: 他の会員のセッションIDが窃取される可能性がある
脆弱性②
- 発見箇所: パスワード変更機能(
/member/change_password) - 再現手順: 以下のHTMLを罠サイトに設置し、ログイン済みの会員にアクセスさせると、パスワードが変更された
<form action="https://c-sha.example.com/member/change_password" method="POST">
<input type="hidden" name="new_password" value="hacked123">
</form>
<script>document.forms[0].submit();</script>
脆弱性③
- 発見箇所: ログイン機能のエラーメッセージ
- 正規ユーザ(存在するID)のエラー: 「パスワードが違います」
- 存在しないIDのエラー: 「IDが存在しません」
- 影響: IDの存在有無が確認でき、標的型攻撃の前段階に悪用される
設問1
脆弱性①と脆弱性②の名称をそれぞれ答え、脆弱性①の直接的な対策を1つ具体的に述べよ。
設問1の解答・解説を見る
正解例:
- 脆弱性①:クロスサイトスクリプティング(XSS)
- 脆弱性②:クロスサイトリクエストフォージェリ(CSRF)
- 脆弱性①の対策:出力時にHTMLの特殊文字(
<>"&等)をエスケープ処理し、スクリプトとして解釈されないようにする。またはContent-Security-Policyヘッダを設定しインラインスクリプトの実行を禁止する。
解説: XSSの根本対策は入力値検証ではなく出力時のエスケープです。入力値検証だけでは迂回される可能性があります。CSPヘッダによるインラインスクリプト禁止も有効な多層防御です。
採点基準:
- XSS・CSRFの名称(各2点)
- 対策が「出力エスケープ」または「CSP」である(2点)
設問2
脆弱性②の対策として「CSRFトークン」を実装する場合、その仕組みを60字以内で説明せよ。また脆弱性③が引き起こすリスクと対策を答えよ。
設問2の解答・解説を見る
正解例(CSRFトークン): サーバがセッションごとに予測困難なトークンを生成してフォームに埋め込み、リクエスト送信時にトークンを検証することで正規フォームからの送信か確認する。
正解例(脆弱性③):
- リスク:IDの存在有無が判明するため、攻撃者が有効なIDを列挙(アカウント列挙攻撃)し、パスワードスプレー攻撃や標的型フィッシングに悪用される。
- 対策:IDの有無によらず「IDまたはパスワードが正しくありません」などの統一したエラーメッセージを返す。
解説: 罠サイトはCSRFトークンの値を知ることができないため、フォームの偽装が無効化されます。脆弱性③はアカウント列挙(User Enumeration)と呼ばれ、エラーメッセージの統一とレートリミットの組み合わせが効果的です。
採点基準:
- CSRFトークンの説明に「セッションごとに生成」「フォームに埋め込み」「検証」の要素(3点)
- リスクに「アカウント列挙」「総当たり/スプレー攻撃」への言及(2点)
- 対策に「エラーメッセージの統一」が含まれる(1点)
重要キーワード
| 用語 | 説明 |
|---|---|
| XSS(クロスサイトスクリプティング) | 悪意あるスクリプトをWebページに埋め込み、閲覧者のブラウザ上で実行させる攻撃 |
| CSRF(クロスサイトリクエストフォージェリ) | 正規ユーザのセッションを悪用して意図しないリクエストをサーバに送信させる攻撃 |
| CSRFトークン | セッションごとに生成する予測困難な値。フォームに埋め込みリクエストの正当性を検証する |
| スタックカナリア | 戻りアドレス手前に配置する検知値。バッファオーバーフローによる改ざんを検出する |
| ASLR | メモリ配置をランダム化しシェルコードの実行先アドレス予測を困難にするOS機能 |
| アカウント列挙攻撃 | エラーメッセージの差異等を利用して有効なユーザIDを特定する攻撃 |
まとめ
- 午前I視点: XSS・CSRF・SQLi・ディレクトリトラバーサル・OSコマンドインジェクションは攻撃対象と対策のセットで覚える。混同しやすい記述問題が頻出
- 午前II視点: バッファオーバーフロー対策はOSレベル(ASLR・DEP)とコンパイラレベル(スタックカナリア)に分けて整理する。WAFは根本対策にならない点に注意
- 午後視点: 脆弱性レポートから攻撃種別を正確に識別し、CSRFトークンの仕組みとアカウント列挙対策を具体的に説明できるようにする