utsuroi path traversal labs 知識ベース 01 / 02 — ファイルシステム
Filesystem & Paths · Knowledge Base
01

ファイルシステムとパス

Absolute, relative, and the dangerous ..

Path Traversal は、サーバの「ファイル」という資源を扱う処理に潜む脆弱性。攻撃を理解するには、ファイルシステムの構造と、パス文字列がどう解釈されるかを押さえる必要があります。

1. ファイルシステムの階層構造 #filesystem

サーバの中身は、ディレクトリの入れ子で組み立てられている。

Linux サーバでは、ファイルは木構造のディレクトリに置かれます。ルートディレクトリ / から始まり、その下に etcvarhome 等のサブディレクトリがあります。

/
├── etc/
│   ├── passwd          ← ユーザ一覧(歴史的にここ)
│   ├── shadow          ← パスワードハッシュ
│   └── nginx/
│       └── nginx.conf
├── var/
│   ├── www/
│   │   └── utsuroi/    ← うつろい EC のソース
│   │       ├── public/
│   │       │   └── images/
│   │       └── config/
│   │           └── secrets.yml
│   └── log/
│       └── nginx/access.log
└── home/
    └── ec_user/.ssh/id_rsa

2. 絶対パスと相対パス #absolute-relative

「どこから測るか」の違い。

Web サーバがファイルを読むとき、内部で基準ディレクトリ(例: /var/www/utsuroi/public/)があり、ユーザが指定したファイル名をその下から探します。

// 想定される実装
$base = '/var/www/utsuroi/public/images/';
$file = $_GET['file'];               // ユーザが指定したファイル名
$path = $base . $file;               // 連結
return readfile($path);

3. 特殊な .. #dot-dot

「親ディレクトリへ移動」を意味する。

.. は「1つ上の階層」を意味する特別な名前。これを連結することで、基準ディレクトリより上の階層にアクセスできてしまいます。

$base = '/var/www/utsuroi/public/images/';
$file = '../config/secrets.yml';   // ユーザが .. を含む値を送る
$path = '/var/www/utsuroi/public/images/../config/secrets.yml';
//      = '/var/www/utsuroi/public/config/secrets.yml'
//      ↑ /images/ から1階層上がった /public/config/ に到達

さらに .. を重ねれば、より上位に行ける:

$file = '../../../../etc/passwd';
$path = '/var/www/utsuroi/public/images/../../../../etc/passwd';
//      = '/etc/passwd'
//      ↑ ルートまで遡れば、サーバ内の任意のファイルにアクセス可能
これが Path Traversal の核

ユーザ入力に .. が含まれることを許すと、攻撃者は基準ディレクトリの「外」のファイルを読めてしまいます。これが Path Traversal(または Directory Traversal)脆弱性です。

4. Web サーバが触るファイル #web-server-files

Web サーバプロセスは多くのファイルを読み書きできる。

Web サーバ(nginx、Apache、PHP-FPM、Node.js 等のプロセス)は、特定のユーザ(例: www-data)として動いていて、そのユーザが読めるファイル全てが Path Traversal で漏洩しうる対象です。

Web アプリのプロセスから読めることが多いファイル:

5. 攻撃者が読みたいファイル #sensitive-files

/etc/passwd は伝統だが、本命は別の所」。

Path Traversal の練習問題でよく /etc/passwd が登場しますが、これは「Path Traversal が成立した」ことを示す指標で、攻撃者が本当に欲しい情報は他にあります。

実際の攻撃では、/etc/passwd を試して Path Traversal の存在を確認したら、ターゲットアプリの典型的なパスを総当たりで読み取り、認証情報を取得 → 横展開、というパターンが多い。