情報セキュリティマネジメント 2017年 春期 午前(科目A) 問23
問題文
ディレクトリトラバーサル攻撃に該当するものはどれか。
選択肢
ア:攻撃者が、Webアプリケーションの入力データとしてデータベースへの命令文を構成するデータを入力し、管理者の意図していないSQL文を実行させる。
イ:攻撃者が、パス名を使ってファイルを指定し、管理者の意図していないファイルを不正に閲覧する。(正解)
ウ:攻撃者が、利用者をWebサイトに誘導した上で、WebアプリケーションによるHTML出力のエスケープ処理の欠陥を悪用し、利用者のWebブラウザで悪意のあるスクリプトを実行させる。
エ:セッションIDによってセッションが管理されるとき、攻撃者がログイン中の利用者のセッションIDを不正に取得し、その利用者になりすましてサーバにアクセスする。
🔒 解説は解答すると表示されます
ディレクトリトラバーサル【情報セキュリティマネジメント解説】
正解の理由
ディレクトリトラバーサルとは、Webアプリケーションなどに対して「../」のような相対パスやエンコードを使い、当初許可されていたディレクトリの外にあるファイルを参照・取得する攻撃です。選択肢の中では、ファイルをパス名で指定して管理者の意図しないファイルを不正に閲覧する説明がこれに当たります。つまり、イが該当します。
ポイントは「パス名を操作して本来アクセスさせないファイルに到達する」という点です。攻撃者は設定ファイルやパスワード一覧、バックアップファイルなどを閲覧できるため被害が大きくなります。
解法ステップ
- 問題文で「ファイル」「パス名」「不正に閲覧」などの語があるか探す。これらはディレクトリ/パスに関する攻撃を示すキーワードです。
- 各選択肢の行為を代表的な脆弱性と結びつける:
- データベース命令の挿入 → SQLインジェクション
- HTML出力の不備でブラウザ上でスクリプト実行 → XSS(クロスサイトスクリプティング)
- セッションIDを奪う → セッションハイジャック
- パス名で意図しないファイルを指定 → ディレクトリトラバーサル(本問題の正解)
- 最も該当する脆弱性名を選ぶ。
選択肢別の誤答解説
- ア: これはSQLインジェクションです。データベース(情報を格納・検索する仕組み)への命令文を入力で改変し、意図しないSQLを実行させる攻撃で、ファイルパスの操作とは別種です。
- イ: ファイルのパス(pathname)を操作して本来アクセスできないファイルを取得する攻撃で、ディレクトリトラバーサルに該当します。
- ウ: これはXSS(クロスサイトスクリプティング)です。Webページに悪意あるスクリプトを埋め込み、訪問者のブラウザ上で実行させる攻撃です。ファイルシステムのパス操作とは異なります。
- エ: セッションIDを不正入手して利用者になりすます行為はセッションハイジャック(乗っ取り)です。セッション管理の問題で、ディレクトリ構造の直接アクセスとは無関係です。
よくある誤解
- 「ディレクトリトラバーサルはサーバ内のファイル改ざんをする攻撃だ」
- 実際は主にファイルの閲覧・取得が目的です(ただし閲覧した情報で更なる侵害に繋がることはあります)。
- 「URLに../が使われなければ大丈夫」
- 実際には %2e%2e(URLエンコード)やUTF-8のエンコード、シンボリックリンクを経由する等、さまざまな手法があるため単純な文字列チェックだけでは不十分です。
補足コラム
実際の職場でのイメージ:社内向けのファイルダウンロード機能で、従業員が自分のレポートを取るはずが、攻撃者が「../../config/passwords.txt」のように指定して社内の設定ファイルをダウンロードしてしまう、というケースがあります。これを防ぐには、下に挙げる対策を組み合わせる運用が必要です。
主な対策(現場ですぐ役立つもの)
- 入力の正規化(normalization)とホワイトリスト(許可するパスのみ受付)。
- パスを組み立てるときは安全なAPIを使う(例:ベースディレクトリからの相対結合と正規化、os.path.commonpathでベースを越えていないか確認する)。
- Webアプリとファイルのアクセス権を最小権限にする。重要ファイルはWebサーバが直接読めない場所に置く。
- ファイル名に人が予測しにくいトークンを付ける(直接パスを渡させない設計)。
- ログと監査:アクセス試行を検知してブロック・通知する。
安全なパスチェックの簡単な例(Python)
import os
BASE = '/var/www/files' # 許可する基点ディレクトリ
def safe_open(user_input):
# ユーザ入力をパス結合・正規化
requested = os.path.normpath(os.path.join(BASE, user_input))
# ベースディレクトリに収まっているか確認
if os.path.commonpath([BASE, requested]) != BASE:
raise ValueError("不正なパス指定です")
return open(requested, 'rb')
FAQ
Q1: ディレクトリトラバーサルと「ファイルインクルード(LFI/RFI)」は同じですか?
A1: 近い概念ですが用途が異なります。ディレクトリトラバーサルはファイルの参照・取得が中心です。LFI(Local File Inclusion)は外部から指定されたファイルをサーバ側で読み込んで処理する脆弱性で、リモートコード実行など更に危険な結果を招くことがあります。どちらも「パス操作」を悪用する点で関連します。
A1: 近い概念ですが用途が異なります。ディレクトリトラバーサルはファイルの参照・取得が中心です。LFI(Local File Inclusion)は外部から指定されたファイルをサーバ側で読み込んで処理する脆弱性で、リモートコード実行など更に危険な結果を招くことがあります。どちらも「パス操作」を悪用する点で関連します。
Q2: テスト環境で脆弱性を確認したい場合は?
A2: 権限のある環境でだけ行ってください。公開サイトや他人のシステムで試すのは不正アクセスに当たります。自社のテスト環境で、既知の脆弱性スキャナーや手動確認(../やエンコード変種を送る)で検査します。
A2: 権限のある環境でだけ行ってください。公開サイトや他人のシステムで試すのは不正アクセスに当たります。自社のテスト環境で、既知の脆弱性スキャナーや手動確認(../やエンコード変種を送る)で検査します。
Q3: 単純な文字列チェック(../をブロック)で十分ですか?
A3: いいえ。エンコードや別の表現を利用されると bypass されます。正規化してから検査する、ホワイトリストで完全なパス制御を行うなど多層防御が必要です。
A3: いいえ。エンコードや別の表現を利用されると bypass されます。正規化してから検査する、ホワイトリストで完全なパス制御を行うなど多層防御が必要です。
関連キーワード: ディレクトリトラバーサル、パストラバーサル、入力検証、パス正規化、ホワイトリスト、SQLインジェクション、XSS、セッションハイジャック, ファイルアクセス制御

\ せっかくなら /
情報セキュリティマネジメントを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

