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