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, (^^ゞ