基本情報技術者 2014年 秋期 午前(科目A) 問44
問題文
ディレクトリトラバーサル攻撃に該当するものはどれか。
選択肢
ア:Webアプリケーションの入力データとしてデータベースへの命令文を構成するデータを入力し、想定外のSQL文を実行させる。
イ:Webサイトに利用者を誘導した上で、WebアプリケーションによるHTML出力のエスケープ処理の欠陥を悪用し、利用者のブラウザで悪意のあるスクリプトを実行させる。
ウ:セッションIDによってセッションが管理されるとき、ログイン中の利用者のセッションIDを不正に取得し、その利用者になりすましてサーバにアクセスする。
エ:パス名を含めてファイルを指定することによって、管理者が意図していないファイルを不正に閲覧する。(正解)
##: ディレクトリトラバーサル攻撃に該当するものはどれか。【午前2 解説】
要点まとめ
- 結論:パス名を操作して管理者の意図しないファイルを参照・取得する攻撃が該当し、正解はエです。典型的には「../」等でWebルート外のファイルを読み取ります。
- 根拠:ディレクトリトラバーサルはファイルパスの検証不足を突き、利用者入力でファイルシステム上の位置を移動できる点が特徴であり、選択肢エの説明と一致します。
- 差がつくポイント:区切り文字やURLエンコード、絶対パス/相対パスの正規化、ホワイトリスト化で防御する点を押さえておくと設問で迷いません。
正解の理由
正解: エ
選択肢エは「パス名を含めてファイルを指定することによって、管理者が意図していないファイルを不正に閲覧する。」とあり、これはまさにディレクトリ(パス)トラバーサル攻撃の定義そのものです。攻撃者が入力フィールドに「../」や「../../etc/passwd」といったパス操作を入れることで、ウェブアプリケーションが想定外のファイルを返してしまう状況を指します。
選択肢エは「パス名を含めてファイルを指定することによって、管理者が意図していないファイルを不正に閲覧する。」とあり、これはまさにディレクトリ(パス)トラバーサル攻撃の定義そのものです。攻撃者が入力フィールドに「../」や「../../etc/passwd」といったパス操作を入れることで、ウェブアプリケーションが想定外のファイルを返してしまう状況を指します。
よくある誤解
- 「ファイルを読み取る=SQLやスクリプト系攻撃」と混同しがちですが、ディレクトリトラバーサルはファイルパス操作が主因で、SQLインジェクションやXSSとは別カテゴリです。
- URLエンコードやパーセントエンコーディングされた「%2e%2e/」を見落として防御が甘くなることが多い点を軽視しないでください。
- 単に入力長制限を設ければ安全、という誤解。正規化とパスの検査(基底ディレクトリの限定)が必須です。
解法ステップ
- 問題文で攻撃対象の「手段」を特定する(入力で何を操作しているかを確認)。
- 選択肢の説明を「どのリソースを操作しているか」で分類(DB命令・HTML出力・セッションID・パス名)。
- 「パス名を操作してファイルを参照する」記述があればディレクトリトラバーサルと判断する。
- 他の選択肢と対比して、SQLインジェクション/XSS/セッションハイジャックと混同していないか確認する。
選択肢別の誤答解説
- ア: Webアプリの入力で想定外のSQL文を実行させる → これはSQLインジェクション。ディレクトリトラバーサルとは手段と対象が異なります。
- イ: HTML出力のエスケープ欠陥でブラウザ上でスクリプトを実行 → これはクロスサイトスクリプティング(XSS)。出力の文脈と影響範囲が異なります。
- ウ: セッションIDを不正取得して利用者になりすます → セッションハイジャック/セッション固定などの認証関連攻撃で、ファイル参照とは別問題です。
- エ: パス名を含めてファイルを指定し、意図しないファイルを閲覧する → これがディレクトリトラバーサルそのもの。正解です。
補足コラム
ディレクトリトラバーサルのバリエーションには相対パス(../)、絶対パス、パーセントエンコーディング、多重エンコード、nullバイト攻撃(古い言語・環境でのファイル名切断)などがあります。防御策としては次が有効です。
- 入力の正規化(パーセントデコード+パス正規化)と基底ディレクトリとの比較。
- ホワイトリスト方式で許可されたファイル名のみを受け付ける。
- サーバ権限を最小化し、読み取り対象を限定する。
- Webサーバやアプリケーションでのディレクトリリスト表示禁止設定。
安全なパス検査の簡単な例(Python):
import os
def is_safe_path(basedir, user_path):
# 結合して正規化(絶対パス化)
requested = os.path.realpath(os.path.join(basedir, user_path))
# 基底ディレクトリと共通パスが基底そのものなら安全
return os.path.commonpath([basedir, requested]) == os.path.realpath(basedir)
# 使い方
basedir = "/var/www/html/uploads"
print(is_safe_path(basedir, "../etc/passwd")) # False
print(is_safe_path(basedir, "user/photo.jpg")) # True(許可されれば)
FAQ
Q1: ディレクトリトラバーサルとローカルファイルインクルード(LFI)の違いは?
A1: 本質的には近いですが、LFIはアプリが動的にファイルを実行/インクルードする場合にコード実行や情報漏えいを引き起こす点でより危険なことがあります。トラバーサルは主にファイル参照(読み取り)を指します。
A1: 本質的には近いですが、LFIはアプリが動的にファイルを実行/インクルードする場合にコード実行や情報漏えいを引き起こす点でより危険なことがあります。トラバーサルは主にファイル参照(読み取り)を指します。
Q2: URLエンコードされた「%2e%2e」をどう扱うべき?
A2: 受け取った入力はまず正規化(デコード)し、さらにパスの正規化を行ってから判定します。複数回エンコードにも注意が必要です。
A2: 受け取った入力はまず正規化(デコード)し、さらにパスの正規化を行ってから判定します。複数回エンコードにも注意が必要です。
Q3: サーバ側での対策で最も効果的なのは?
A3: 入力のホワイトリスト化+パスの正規化と基底ディレクトリ固定、及び最小権限運用の組合せが効果的です。
A3: 入力のホワイトリスト化+パスの正規化と基底ディレクトリ固定、及び最小権限運用の組合せが効果的です。
関連キーワード: ディレクトリトラバーサル、パストラバーサル、ファイル参照、パス正規化、入力検証、ホワイトリスト、OWASP、XSS、SQLインジェクション、セッションハイジャック

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

