基本情報技術者 2017年 春期 午前(科目A) 問37
問題文
ディレクトリトラバーサル攻撃に該当するものはどれか。
選択肢
ア:攻撃者が、Webアプリケーションの入力データとしてデータベースへの命令文を構成するデータを入力し、管理者の意図していないSQL文を実行させる。
イ:攻撃者が、パス名を使ってファイルを指定し、管理者の意図していないファイルを不正に閲覧する。(正解)
ウ:攻撃者が、利用者をWebサイトに誘導した上で、WebアプリケーションによるHTML出力のエスケープ処理の欠陥を悪用し、利用者のWebブラウザで悪意のあるスクリプトを実行させる。
エ:セッションIDによってセッションが管理されるとき、攻撃者がログイン中の利用者のセッションIDを不正に取得し、その利用者になりすましてサーバにアクセスする。
🔒 解説は解答すると表示されます
ディレクトリトラバーサル攻撃【午前解説】
正解の理由
正解は イ です。ディレクトリトラバーサル(Path Traversal)は、入力として渡されたパス名を操作してアプリケーションの意図しないファイルにアクセスする攻撃を指します。設問の「パス名を使ってファイルを指定し、管理者の意図していないファイルを不正に閲覧する。」はこの定義に一致するため正解です。
他の選択肢はそれぞれ別の攻撃手法を説明しています。アはSQLインジェクション、ウはクロスサイトスクリプティング(XSS)、エはセッションハイジャック/セッション乗っ取りに該当し、ディレクトリトラバーサルではありません。
解法ステップ
- 問題文でキーワード「パス名」「ファイル」「不正に閲覧」を探す。
- 攻撃の定義を思い出し、パスを操作して読み取り範囲外へ行く攻撃=ディレクトリトラバーサルと対応づける。
- 他選択肢が説明する攻撃(SQLインジェクション、XSS、セッション乗っ取り)と照合して除外する。
選択肢別の誤答解説
- ア: 攻撃者が入力で意図しないSQL文を実行させるのはSQLインジェクション。データベース命令の改変が目的で、ファイルパス操作とは異なります。
- イ: 正解。パス名を使って不正にファイルを閲覧する攻撃で、相対パスやエンコード技術で本来参照できないファイルに到達します。
- ウ: 利用者のブラウザ上で悪意あるスクリプトを実行させるのはクロスサイトスクリプティング(XSS)。出力時のエスケープ欠如が原因です。
- エ: ログイン利用者のセッションIDを盗んで成りすますのはセッションハイジャック(またはセッション固定化含む)。セッション管理の脆弱性に関する攻撃です。
よくある誤解
- 相対パスの「../」だけが問題と思い込み、URLエンコードやUTF-8混入、Windowsのバックスラッシュ「..\」経由の攻撃を見落とす誤り。
- 「ファイル名を長さチェックすれば安全」と考えるが、正規化(canonicalize)前の検査やパス結合方法次第で回避される場合があること。
- アクセス制御がアプリ層ではなくファイルシステムの権限に依存していると誤解し、アプリ側での入力検証を怠るケース。
補足コラム
ディレクトリトラバーサルの典型的なペイロードには "../etc/passwd" のような相対パスや、そのURLエンコード("%2e%2e%2f")が含まれます。防御策としては次が基本です:
- 入力されたパスを受け取る場合は必ず正規化(realpath 等)して、許可されたディレクトリのプレフィックスを持つか確認する。
- ファイル名は許可リスト(ホワイトリスト)で制御し、ブラックリスト("../" の除去など)のみで済ませない。
- WebサーバやOSの権限設定を厳格にし、アプリがアクセスすべき以外のファイルに読み取り権限を与えない。
- Symlink を介した回避やエンコードによるバイパスにも注意する。
安全なパス検査の簡単な例(Python):
import os
BASE_DIR = "/var/www/files"
def safe_join(base, user_path):
target = os.path.realpath(os.path.join(base, user_path))
if os.path.commonpath([base]) == os.path.commonpath([base, target]):
return target
raise ValueError("不正なパスです")
# 使い方
try:
path = safe_join(BASE_DIR, "../etc/passwd")
except ValueError:
print("アクセス拒否")
FAQ
Q1: ディレクトリトラバーサルとローカルファイル読み取り脆弱性の違いは何ですか?
A1: ほぼ同義に使われることが多いですが、一般には「ディレクトリトラバーサル」はパス操作でアプリケーションの許可領域外のファイルを参照する技法全般を指します。
A1: ほぼ同義に使われることが多いですが、一般には「ディレクトリトラバーサル」はパス操作でアプリケーションの許可領域外のファイルを参照する技法全般を指します。
Q2: URLエンコードされた「%2e%2e%2f」で防げないのはなぜですか?
A2: 多くの攻撃はエンコードや二重エンコードを使って検査を回避します。正規化してから検査することで対応可能です。
A2: 多くの攻撃はエンコードや二重エンコードを使って検査を回避します。正規化してから検査することで対応可能です。
Q3: ファイルシステム側の権限だけで十分ですか?
A3: 権限は重要ですが、アプリケーション層での入力検証も必要です。両方を組み合わせた防御が必須です。
A3: 権限は重要ですが、アプリケーション層での入力検証も必要です。両方を組み合わせた防御が必須です。
関連キーワード: ディレクトリトラバーサル、パストラバーサル、パス正規化、パス検証、相対パス、エンコードバイパス、ホワイトリスト、SQLインジェクション、XSS、セッションハイジャック、OWASP、ファイルアクセス制御

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

