Hello there, ('ω')ノ
🛒 想定シナリオ:画像を表示するショッピングサイト
例えば次のようなHTMLが商品画像の表示に使われているとします:
<img src="/loadImage?filename=218.png">
この例では、サーバー側は次のように動作します:
- パラメータ
filenameに指定された値を /var/www/images/という固定パスに結合して- 該当ファイルを読み取る
つまり、内部的には以下のような処理が行われています:
/var/www/images/218.png
🔓 脆弱性:ユーザー入力がそのままファイルパスに使われている
この場合、ユーザーが次のようなリクエストを送ればどうなるでしょうか?
/loadImage?filename=../../../etc/passwd
これは次のような実行になります:
/var/www/images/../../../etc/passwd
../ はディレクトリ階層を1つ上に上がる意味です。
../../../によって/var/www/images/→/etc/に移動- 結果:
/etc/passwdファイルが読み取られる
📁 /etc/passwdとは?
- LinuxやUnix系OSで使われるユーザー情報ファイル
- ログインユーザー一覧、UID、ホームディレクトリなどが含まれる
- 例:
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
🖥️ Windows環境でも攻撃可能
Windowsでは次のようなURLが使えます:
/loadImage?filename=..\..\..\windows\win.ini
→ C:\windows\win.ini は古くからあるWindows設定ファイルで、存在確認などに使われます。
✅ ポイントまとめ
| 観点 | 内容 |
|---|---|
| 🎯 攻撃目的 | アプリケーションやOSの機密ファイルを盗み見ること |
| ⚠️ 脆弱な実装 | ユーザー入力をパスに直接結合して使っている |
| 🛡️ 対策方法 | - 絶対パスでホワイトリスト管理 - ../ やエンコード版をブロック- ファイル名のバリデーション |
✅ まとめ
「../」を使ってフォルダの階層をさかのぼり、サーバー内の任意ファイルを読み取る これがパストラバーサルの本質です。
Best regards, (^^ゞ