Shikata Ga Nai

Private? There is no such things.

パストラバーサルによる任意ファイルの読み取り攻撃:実例と仕組み

Hello there, ('ω')ノ

✅ 攻撃対象のアプリケーション例

あるショッピングサイトでは、商品画像を次のように表示しています:

<img src="/loadImage?filename=218.png">

🎯 アプリ側の処理

  1. filename パラメータを取得
  2. ベースパス /var/www/images/ に結合
  3. 実ファイルパスを生成
/var/www/images/218.png
  1. ファイルシステムAPIでファイルを読み込み → 画像を返す

🎯 脆弱ポイント:入力値の未検証

このアプリでは filename の値に対して検証がないため、 攻撃者は相対パス記法 (../) を使って任意のファイルにアクセスできます。


✅ 実際の攻撃例(UNIX/Linuxサーバー)

GET /loadImage?filename=../../../etc/passwd HTTP/1.1

🎯 サーバーが実際に参照するパス

/var/www/images/../../../etc/passwd
  • ../1階層上に移動する記号
  • /var/www/images//var/www//var//
  • 最終的に /etc/passwd を読み込む

📋 /etc/passwd とは

  • UNIX/Linuxの登録ユーザー情報ファイル
  • 実際のパスワードは含まれないが、 ユーザー一覧・シェル・ホームディレクトリ などの情報が取得できる

✅ Windowsサーバーへの攻撃例

Windowsでは ../..\ のどちらも使えます。

GET /loadImage?filename=..\..\..\windows\win.ini HTTP/1.1

🎯 サーバーが参照するパス

C:\var\www\images\..\..\..\windows\win.ini
→ C:\windows\win.ini
  • win.ini は古いWindows設定ファイル
  • 現代ではそこまで重要ではないが、パストラバーサル成功確認のテスト用によく使われる

✅ 攻撃者が狙うファイル例

OS ファイル
Linux/UNIX /etc/passwd, /etc/shadow, /home/ユーザー名/.ssh/id_rsa
Windows C:\Windows\System32\config\SAM, C:\boot.ini, C:\Users\Administrator\Desktop\*
共通 アプリ設定ファイル (config.php, .env, database.yml)

✅ 防御策(開発者向け)

対策 説明
絶対パス化 + ベースパスチェック OSのrealpath()で絶対パスにして/var/www/images/配下か確認
ユーザー入力値をファイルパスに直接渡さない ファイルIDやハッシュ等に変換して内部マッピング
../, %2e%2e%2f 等の文字列除去 相対パス記法を全て排除
最低権限のユーザーでアプリを実行 万が一突破されても被害を最小限に

✅ まとめ

「入力値をそのままパスに使う=即パストラバーサル脆弱」 開発側は常に

  • 入力の正規化
  • パス制限
  • 安全なファイルアクセスAPI を徹底することが不可欠です。

Best regards, (^^ゞ