パス指定を悪用して公開対象外のファイルに不正アクセスする攻撃。
ディレクトリトラバーサルとは、ファイルの パス(=置き場所を表す住所のような文字列)の指定を悪用して、本来は公開していないディレクトリ(=フォルダ)の中のファイルに不正アクセスする攻撃です。「トラバーサル」は英語で「横断・たどること」を意味します。
身近な例で考えると、図書館で「閲覧コーナーの本」しか借りられないはずなのに、棚の裏を通って書庫の機密資料を持ち出すようなものです。本来たどってよい通路(公開フォルダ)から、こっそり立入禁止区域(機密フォルダ)へ抜け出してしまいます。
上のツールで▶ボタンを押すと、攻撃者が ../ を使って公開フォルダの外へさかのぼり、機密ファイルを読み取る流れと、入力検証で攻撃が止まる様子を確認できます。
鍵になるのは ../(ドット2つ+スラッシュ)という記号です。これは相対パスで「ひとつ上のフォルダへ戻る」という意味を持ちます。たとえば public/img/a.png にいるとき ../ を付けると img の親である public に戻ります。
攻撃は次の順で進みます。
・① 注入:ファイル名のかわりに ../../../etc/passwd のようなパスを送る
・② 解決:脆弱なサーバが ../ をそのまま解釈し、public → www → var とフォルダをさかのぼる
・③ 脱出:公開フォルダの外(システム設定フォルダ)まで到達してしまう
・④ 漏えい:利用者一覧・設定ファイル・ソースコードなど機密情報が読み取られる
原因は 「上に戻る」操作に制限がないことです。利用者の入力をそのままファイルの場所として使ってしまうため、本来たどってよい範囲を超えてしまいます。上のツールのresolveステップで、フォルダを次々とさかのぼる様子を見てください。
根本的な対策は入力値検証です。利用者から受け取ったパスを、ファイルの場所として使う前にチェックします。基本の考え方は「公開フォルダより上には絶対に出さない」ことです。
具体的には次の対策を組み合わせます。
・../ の検出:パスに ../ が含まれていたら拒否する
・絶対パスへの変換:実際にアクセスする場所を求め、公開フォルダの内側か確認する
・ホワイトリスト方式:あらかじめ許可したファイル名だけを受け付ける
・権限設定:Webサーバが公開フォルダの外を読めないようにアクセス権を制限する
これらを徹底すれば、たとえ ../ を送られても 公開フォルダの外には到達できず、機密ファイルは守られます。立入禁止の扉に必ず鍵をかけておくイメージです。上のツールの最終ステップで、検証によって攻撃が拒否される様子を確認してください。
コンピュータのファイルは「フォルダの中にフォルダ」という階層構造(ツリー構造)で管理されています。ファイルの場所を表す文字列をパス(path=道筋)と言い、../ は「ひとつ上のフォルダへ戻る」という特別な意味を持つ相対パス記号です。
パスには2種類あります。
・絶対パス:ルート(=最上位のフォルダ)から書いたフルの住所。例:/var/www/public/top.html
・相対パス:今いる場所を基点に書いた住所。../ で「ひとつ上へ」、../../ で「ふたつ上へ」と移動できる
なぜ攻撃に使えるのか。Webサーバは本来、公開フォルダ(/var/www/public/)の中だけを外部に見せる設計です。しかし ../ を重ねると階層を「上へ上へ」とさかのぼれるため、公開フォルダの外にあるファイル(設定ファイル・パスワードが入ったファイルなど)へもアクセスできてしまいます。マンションの自分の部屋から廊下に出て、鍵がかかっていない別の部屋に入れてしまうイメージです。
Webサーバのファイルは大きく2つの領域に分かれています。
・公開フォルダ:ブラウザから誰でも取得できるHTMLやCSSが入った領域
・非公開領域:データベースの接続情報(=どのサーバに誰の名前でつなぐかの情報)、設定ファイル、パスワードが入った領域。外部に出ると重大な問題になる
なぜこの境界が大切なのか。Webサーバは「公開フォルダに入ったファイルの取得要求」だけを処理するよう設計されています。ところが入力値を検証しないと、../ を使って非公開領域まで到達できてしまいます。これがディレクトリトラバーサルです。
身近な例で考えると、ショーウィンドウ(公開フォルダ)に展示してあるものは誰でも見られますが、バックヤード(非公開)は関係者以外立入禁止です。バックヤードへの扉に鍵をかけておくこと(入力検証・アクセス権設定)が、トラバーサル攻撃を防ぐための基本です。上のツールのdefenseステップで、入力検証が壁として機能する様子を確認してください。