Hello there, ('ω')ノ
✅ 攻撃対象のアプリケーション例
あるショッピングサイトでは、商品画像を次のように表示しています:
<img src="/loadImage?filename=218.png">
🎯 アプリ側の処理
filenameパラメータを取得- ベースパス
/var/www/images/に結合 - 実ファイルパスを生成
/var/www/images/218.png
- ファイルシステム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, (^^ゞ