【悪用厳禁】ディレクトリトラバーサル攻撃とは?攻撃手法・対策方法を解説

記事サムネイル

Webサイトを運営していると、様々なサイバー攻撃の脅威に晒されます。その中でも「ディレクトリトラバーサル」は、古くから知られていながら、今なお多くのWebサイトで発見される基本的な脆弱性の一つです。

この記事では、ディレクトリトラバーサル攻撃の仕組みから、具体的な攻撃手法、そして効果的な対策方法までを徹底的に解説します。

自社のWebサイトを守るためにも、この攻撃への理解を深めていきましょう。


誰でも無料で参加できるハッキング体験会の参加者募集中!!

セキュ塾のハッキング体験会告知チラシ

ディレクトリトラバーサルとは

WebサイトのURL

ディレクトリトラバーサル(Directory Traversal)とは、Webサーバー上のファイルやディレクトリのパスを不正に操作することで、本来アクセスが許可されていないファイルやディレクトリにアクセスしようとするサイバー攻撃です。

攻撃者は、URLのパラメータなどを通じて、ディレクトリ構造を遡る特殊な文字列「../」(ドット・ドット・スラッシュ)を送り込みます。これにより、Webサーバーの公開領域の外にある機密情報などを盗み見ることを目的とします。「パストラバーサル(Path Traversal)」や「../(ドットドットスラッシュ)攻撃」とも呼ばれます。


ディレクトリとは

疑問を持つ人

そもそも「ディレクトリ」とは何でしょうか?
簡単に言えば、パソコンで使う「フォルダ」と同じものだと考えてください。

コンピュータでは、ファイルがバラバラに存在していると管理が大変になるため、関連するファイルをまとめて格納する「ディレクトリ」という入れ物を使って階層的に整理します。

Webサイトも同様で、「画像ファイルを置くディレクトリ」「CSSファイルを置くディレクトリ」「プログラムファイルを置くディレクトリ」のように、役割ごとにファイルを整理して保存しています。ディレクトリトラバーサル攻撃は、この整理された階層構造を不正に横断(トラバース)する攻撃なのです。


ディレクトリトラバーサル攻撃を受けると

you've been hacked

ディレクトリトラバーサル攻撃が成功すると、攻撃者はサーバー上の非公開ファイルにアクセスできるようになります。これにより、以下のような深刻な被害が発生する可能性があります。

  • 機密情報の漏洩: wp-config.phpのようなデータベースの接続情報や、パスワードが保存されているファイル(/etc/passwdなど)、各種設定ファイルが盗まれ、システムの乗っ取りやさらなる攻撃の足がかりにされます。
  • ソースコードの流出: Webアプリケーションのソースコードが流出し、ビジネスロジックや他の脆弱性を分析されるリスクがあります。
  • 個人情報の流出: サーバー内に保存されている顧客情報や個人情報が漏洩し、企業の信頼を著しく損なう可能性があります。
  • Webサイトの改ざん: 他の脆弱性と組み合わされることで、ファイルのアップロードや改ざんにつながる危険性もあります。

【悪用厳禁】具体的な攻撃手法を解説

ハッキングを仕掛ける様子

※ここに記載する内容は、セキュリティ意識の向上のための情報提供を目的としています。決して悪用しないでください。

ディレクトリトラバーサル攻撃がどのように行われるのか、その具体的な手口を深く掘り下げてみましょう。攻撃を理解することが、最善の防御に繋がります。

前提知識:「絶対パス」と「相対パス」とは?

攻撃手法を理解するために、まずファイルの位置を示す「パス」の概念を知る必要があります。パスには「絶対パス」と「相対パス」の2種類があります。

  • 絶対パス (Absolute Path)
    最上位の階層(ルートディレクトリ)から目的のファイルまでの経路をすべて記述する方法です。
    例: /var/www/html/user/profile.php
  • 相対パス (Relative Path)
    現在いるディレクトリを基準として、目的のファイルまでの経路を記述する方法です。相対パスでは、以下の特殊な記号が使われます。
    • ./: 現在のディレクトリ
    • ../: 一つ上の階層のディレクトリ

例えば、/var/www/html/user/ にいる時に、/var/www/html/images/logo.png にアクセスしたい場合、相対パスは ../images/logo.png となります。../ で一つ上の /var/www/html/ に移動し、そこから images/ ディレクトリ内の logo.png を指定しています。

ディレクトリトラバーサル攻撃は、この../を悪用してディレクトリ階層を不正に遡ることから始まります。

脆弱なプログラムの例と基本的な攻撃

攻撃者は、ユーザーが入力した値をそのままファイルパスとして利用しているような、脆弱なプログラムを探します。例えば、以下のようなPHPコードがあったとします。

// 例:ユーザーが指定したページを読み込む
$template = $_GET['page'];
include($template . '.html');

このコードは、URLの ?page= の後に指定されたファイル名に .html を付けて読み込むという単純なものです。
開発者は index.php?page=about のように、about.html を読み込ませることを想定しています。

しかし、攻撃者はここに ../ を挿入します。

攻撃URLの例:
https://example.com/index.php?page=../../../../etc/passwd

このURLを受け取ったサーバー側のPHPは、$template../../../../etc/passwd という文字列を代入します。その結果、include()関数は、../../../../etc/passwd.html というパスを解釈しようとします。(末尾の.htmlは付きますが、OSの設定によってはファイルが見つかる場合があります)

../ を何度も繰り返すことで、Webの公開ディレクトリ(/var/www/htmlなど)からどんどん上の階層に移動し、最終的にシステムの重要ファイルである /etc/passwd にたどり着き、その内容を読み込んでしまうのです。

フィルタリングを回避する応用的な攻撃手法

単純な ../ をブロックする対策が施されている場合、攻撃者はそれを回避するために様々なテクニックを使います。

  • URLエンコーディング
    Webブラウザやサーバーは、URL内で使えない文字を % を使った16進数コード(パーセントエンコーディング)に変換して扱います。攻撃者はこれを利用し、../ を直接使わずに攻撃を試みます。
    • .%2e
    • /%2f
    • \%5c (バックスラッシュ)
    攻撃例:
    ../../%2e%2e%2f%2e%2e%2f
    ..\..%2e%2e%5c%2e%2e%5c (Windows系サーバーに有効)
  • 特殊なエンコーディング
    URLエンコードを二重に行う %%32%65%2e%2f や、UTF-8の不正なエンコード(例: %c0%af/ と解釈されるケース)を利用して、セキュリティフィルタのチェックをすり抜ける手口も存在します。
  • その他のバイパス手法
    ....//..././ のように、サーバー側の処理によっては ../ と同じ意味に解釈される可能性のある文字列を送り込む手口もあります。

これらの手法は、開発者が想定していない「抜け道」を突くものであり、対策の難しさを示しています。


ディレクトリトラバーサルによる被害事例

被害にあって絶望する人

ディレクトリトラバーサルは、理論上の脅威ではありません。実際に多くのシステムで被害が発生しています。

  • 大手ECサイトの事例 (2019年)
    ある大手ECサイトの画像表示機能にディレクトリトラバーサルの脆弱性が存在しました。これにより、攻撃者がサーバー内のソースコードや設定ファイルを閲覧できる状態になっていたことが発覚しました。幸い、個人情報の流出は確認されませんでしたが、一歩間違えれば大惨事につながる可能性がありました。
  • Webサーバーソフトウェアの脆弱性
    過去には、ApacheやIISといった主要なWebサーバーソフトウェア自体に、エンコーディング解釈の不備を突いたディレクトリトラバーサルの脆弱性が発見されたことがあります。この場合、そのソフトウェアを利用している広範囲のWebサイトが影響を受けることになります。

ディレクトリトラバーサルに効果的な3つの対策

セキュリティ対策を行う様子

では、この脅威からWebサイトを守るためにはどうすれば良いのでしょうか。効果的な対策を3つご紹介します。

1. 外部からのファイルパス指定を許可しない設計にする

最も根本的で効果的な対策は、ユーザーからの入力値をファイルパスとして直接使用しないことです。

例えば、?page=about?page=contact といったパラメータを受け取る場合でも、その値をそのまま include() のような関数に渡すのは危険です。

安全な設計例として、受け取った値が「許可されたリスト(ホワイトリスト)」に含まれているかを確認する方法があります。

// 安全な設計例
$allowed_pages = [
    'about',
    'contact',
    'products'
];

$page = $_GET['page'];

// 許可されたリストに含まれている場合のみ処理を実行
if (in_array($page, $allowed_pages, true)) {
    include($page . '.html');
} else {
    // エラー処理 or デフォルトページを表示
    include('top.html');
}

この方法であれば、想定外の文字列(../など)が送られてきても、リストに存在しないため処理が実行されず、攻撃を防ぐことができます。

2. 入力値を無害化(サニタイジング)する

外部からの入力をどうしてもファイル名の一部として利用する必要がある場合は、入力値を徹底的に検証し、危険な文字列を無害化(サニタイジング)する必要があります。

  • 危険な文字列の除去: ../.. といった文字列を検出し、拒否するか空文字に置換します。
  • ディレクトリ区切り文字の排除: /\ を入力値から取り除きます。
  • ファイル名のみを抽出: PHPの basename() 関数を使うと、パス情報を取り除き、ファイル名部分だけを安全に抽出できます。これは非常に有効な手段です。
// basename() を使った対策例
$filename = $_GET['file'];
// パス情報をすべて除去し、ファイル名だけを取得
$safe_filename = basename($filename);
include('/var/www/html/files/' . $safe_filename);

3. サーバーの設定を適切に行う

アプリケーションレベルの対策に加え、サーバー自体の設定を堅牢にすることも重要です。

  • アクセス権限の最小化: Webサーバーの実行ユーザーの権限を、必要最小限に設定します。これにより、万が一攻撃が成功しても、閲覧できるファイルの範囲を限定できます。
  • アクセス可能なディレクトリの制限: PHPの open_basedir ディレクティブを設定すると、PHPスクリプトがアクセスできるファイルパスの範囲を特定のディレクトリツリー内に制限できます。これは非常に強力な防御策となります。
  • 非公開ファイルの配置: 設定ファイル (wp-config.phpなど) やソースコード、個人情報など、公開する必要のない重要なファイルは、ドキュメントルート(Webからアクセスできる公開ディレクトリ)の外に配置します。

まとめ

ディレクトリトラバーサルは、攻撃手法としては古典的ですが、今なおWebアプリケーションの設計ミスや実装の不備を突いて発生する深刻な脆弱性です。

攻撃が成功すると、機密情報の漏洩からシステムの乗っ取りまで、甚大な被害につながる可能性があります。

この記事で解説した「ファイルパスを直接指定させない設計」「入力値の無害化」「サーバーの適切な設定」という3つの対策を徹底し、安全なWebサイト運営を心がけましょう。また、定期的な脆弱性診断を受け、自サイトに潜むリスクを早期に発見することも重要です。

誰でも無料で参加できるハッキング体験会の参加者募集中!!

セキュ塾のハッキング体験会告知チラシ