Shikata Ga Nai

Private? There is no such things.

パストラバーサルによる任意ファイルの読み取り攻撃を理解する

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