ウェブアプリケーションのセキュリティを学ぶ中で「ディレクトリトラバーサル」という言葉に出会った方も多いのではないでしょうか。
「攻撃の名前は知っているけど、具体的にどんな仕組みで何が危険なのかよくわからない」という方もいるかもしれません。
本記事では、ディレクトリトラバーサルの意味・仕組み・脆弱性の原理・具体的な攻撃例・対策方法について、わかりやすく解説します。
セキュリティの基礎知識として、開発者・運用者・セキュリティ担当者にとって必ず押さえておくべき内容です。
ディレクトリトラバーサルとは?パスを操作して不正アクセスを行う攻撃手法
それではまず、ディレクトリトラバーサルの基本的な意味と仕組みから解説していきます。
ディレクトリトラバーサル(Directory Traversal)とは、ウェブアプリケーションのファイルパス処理の脆弱性を悪用し、本来アクセスできないはずのファイルやディレクトリに不正にアクセスする攻撃手法です。
「トラバーサル(traversal)」は「横断・移動」という意味で、ディレクトリの階層を横断して移動するイメージからこの名前が付けられています。
「パストラバーサル(Path Traversal)」とも呼ばれ、OWASP(Open Web Application Security Project)でも重要な脆弱性として取り上げられている攻撃です。
ディレクトリトラバーサルの基本的な仕組み
攻撃者は「../」(ドット2つ+スラッシュ)という「親ディレクトリへ移動」を意味する記号を利用して、ウェブサーバーの公開ディレクトリの外側にあるファイルにアクセスしようとします。
例:通常のURL → /images/photo.jpg
攻撃的なURL → /images/../../../etc/passwd
この攻撃が成功すると、サーバーの設定ファイル・パスワードファイル・ソースコードなどの機密情報が外部に漏洩する危険があります。
パスの入力値を適切に検証・制限していないアプリケーションがこの脆弱性の標的となります。
「../」記号の意味
Linuxやウェブサーバーのパスでは、「../」は「ひとつ上の親ディレクトリへ移動する」という意味を持ちます。
たとえば「/var/www/html/」にいる状態で「../../etc/」と指定すると、「/etc/」ディレクトリに移動できてしまうことになります。
攻撃者はこの性質を悪用して、ウェブルート外のディレクトリに到達しようとします。
攻撃の対象となるファイル例
ディレクトリトラバーサル攻撃で狙われやすいファイルには以下のようなものがあります。
| ファイル | 含まれる情報 |
|---|---|
| /etc/passwd(Linux) | ユーザーアカウント情報 |
| /etc/shadow(Linux) | パスワードハッシュ |
| 設定ファイル(config.php等) | データベース接続情報・APIキー |
| ソースコードファイル | アプリケーションのロジック |
| ログファイル | アクセス履歴・エラー情報 |
これらの情報が漏洩すると、さらなる攻撃の足がかりとなるため非常に危険です。
ディレクトリトラバーサルとパスインジェクションの違い
ディレクトリトラバーサルは「パスインジェクション」の一種とも考えられますが、より具体的には「../」などのパス操作記号を使って意図しない場所へアクセスする攻撃を指します。
SQLインジェクションがSQL文を悪用するのと同様に、パスの処理を悪用する点が特徴です。
ディレクトリトラバーサルの具体的な攻撃例
続いては、ディレクトリトラバーサルの具体的な攻撃例を確認していきます。
実際にどのようなリクエストが送られるのかを把握することで、脆弱性の本質がよりよく理解できます。
基本的な攻撃例
【脆弱なコードの例(PHP)】
$filename = $_GET[‘file’];
$filepath = ‘/var/www/html/files/’ . $filename;
echo file_get_contents($filepath);
【攻撃リクエスト例】
通常:https://example.com/getfile.php?file=report.pdf
攻撃:https://example.com/getfile.php?file=../../../etc/passwd
→ サーバーが /etc/passwd の内容を返してしまう
この例では、ユーザーからの入力をそのままパスに結合しているため、「../」を使ったパス操作が有効になってしまう脆弱なコードです。
エンコードを使った攻撃の回避
単純な「../」のフィルタリングだけでは不十分な場合があります。
攻撃者は以下のようなエンコードを使ってフィルタリングをバイパスしようとすることがあります。
【エンコードを使った攻撃例】
URLエンコード:%2e%2e%2f(../のURLエンコード)
二重エンコード:%252e%252e%252f
Unicodeエンコード:..%c0%af(一部の脆弱な実装で有効)
Windowsパス:..\(バックスラッシュを使った変形)
これらの変形パターンにも対応できるよう、単純な文字列マッチングではなく正規化後の検証が必要です。
Windowsサーバーでの攻撃パターン
Windowsサーバーでは「../」に加えて「..\」(バックスラッシュ)も使われることがあります。
またWindowsではファイルパスの大文字・小文字が区別されないため、大文字小文字を変えた変形パターンも攻撃に使われることがあります。
ディレクトリトラバーサルの対策方法
続いては、ディレクトリトラバーサルの具体的な対策方法を確認していきます。
この脆弱性は適切な対策を施すことで確実に防げるため、開発・運用の両面から対策を実施することが重要です。
対策①:ユーザー入力をファイルパスに直接使用しない
最も根本的な対策は、ユーザーからの入力値をファイルパスに直接結合しないことです。
ファイル名をIDや固定リストで管理し、ユーザーの入力はIDのみに限定することで、パス操作自体を無効化できます。
【安全なコードの例(PHP)】
// ホワイトリストで許可するファイルを限定する
$allowed_files = [‘report.pdf’, ‘manual.pdf’, ‘guide.pdf’];
$filename = $_GET[‘file’];
if (in_array($filename, $allowed_files)) {
$filepath = ‘/var/www/html/files/’ . $filename;
echo file_get_contents($filepath);
} else {
echo “不正なリクエストです”;
}
対策②:パスの正規化と検証
やむを得ずユーザー入力をパスに使用する場合は、パスを正規化(realpath関数などで絶対パスに変換)してから、許可されたベースディレクトリ内に収まっているかを確認します。
【Pythonでの安全なパス検証例】
import os
base_dir = ‘/var/www/html/files’
user_input = request.args.get(‘file’)
filepath = os.path.realpath(os.path.join(base_dir, user_input))
if not filepath.startswith(base_dir):
abort(403) # ベースディレクトリ外へのアクセスを拒否
対策③:WAF(ウェブアプリケーションファイアウォール)の導入
WAFを導入することで、「../」などのパス操作を含む不審なリクエストをアプリケーションに到達する前の段階でブロックできます。
コードレベルの対策と組み合わせることで、多層防御が実現できます。
対策④:適切なアクセス権の設定
ウェブサーバーの実行ユーザーに最小限の権限のみを付与することで、仮に攻撃が成功してもアクセスできるファイルの範囲を最小化できます。
重要なファイル(設定ファイル・パスワードファイルなど)へのアクセス権を適切に制限しておくことが重要です。
対策まとめ
| 対策 | 内容 | 効果 |
|---|---|---|
| ホワイトリスト検証 | 許可するファイルを限定する | 根本的な防止 |
| パスの正規化・検証 | realpath等で絶対パスに変換後に検証 | パス操作の無効化 |
| WAFの導入 | 不審なパターンを含むリクエストをブロック | 多層防御 |
| 最小権限の原則 | ウェブサーバーに必要最小限の権限のみ付与 | 被害の最小化 |
| セキュリティテスト | 脆弱性診断・ペネトレーションテストの実施 | 脆弱性の早期発見 |
複数の対策を組み合わせた多層防御が、ディレクトリトラバーサルへの最も効果的なアプローチです。
まとめ
本記事では、ディレクトリトラバーサルの意味・仕組み・具体的な攻撃例・対策方法について解説しました。
ディレクトリトラバーサルとは「../」などのパス操作記号を使ってウェブアプリケーションの公開範囲外のファイルに不正アクセスする攻撃であり、適切な入力検証とパスの正規化によって防ぐことができます。
ホワイトリストによる入力制限・パスの正規化検証・WAFの導入・最小権限の原則を組み合わせることで、確実な多層防御が実現できるでしょう。
開発段階からセキュリティを意識した実装を行うことが、安全なウェブアプリケーションを構築する上で最も重要な姿勢です。
ぜひ本記事を参考に、ディレクトリトラバーサルへの理解と対策をしっかり身につけてみてください。