- WebサーバーのURLやフォーム入力に「../」という特殊な文字列を挿入して、本来アクセスできない非公開ファイルに侵入するサイバー攻撃のこと
- 攻撃が成功すると設定ファイル・パスワードファイル・顧客データが漏洩するリスクがあり、パストラバーサル攻撃とも呼ばれる
- 入力値のサニタイジング・ドキュメントルート外へのアクセス制限・WAFの導入という3つの対策を組み合わせることが基本的な防御策だ
【深掘り】これだけ知ってればOK!
攻撃者はURLエンコード(「../」→「%2e%2e%2f」)やダブルエンコード(「%252e%252e%252f」)を使ってセキュリティフィルターをすり抜ける高度な手法も使う。単純な文字列マッチングだけでは防ぎきれないため、デコード後の値を検証する処理が必要だ。
ファイルダウンロード機能・画像表示機能・帳票PDF生成機能はファイルパスを動的に生成するケースが多く、脆弱性が潜みやすい箇所だ。実際に大手ECサイトでディレクトリトラバーサル攻撃によって数百万件のユーザー情報が流出した事例が報告されている。
OWASP Top 10 2021でも「A01:2021 – Broken Access Control(アクセス制御の不備)」として最重要カテゴリに位置付けられている。定期的なペネトレーションテストで継続的に管理することが重要だ。
よくある誤解
Webアプリの話だから自分には関係ないと思っている
自社のWebサイトやイントラネットのシステムが対象になりうる。ファイルダウンロード機能・画像表示機能・帳票PDF生成機能はファイルパスを動的に生成するケースが多く、脆弱性が潜みやすい箇所だ。
「../」を除去すれば対策完了だと思っている
単純に「../」を除去するだけでは攻撃を防げない。URLエンコード・ダブルエンコード・絶対パスを使った迂回など多様な手法があるため、WAFの導入・最小権限の原則に基づいたアクセス権限設定・定期的な脆弱性診断との組み合わせが必要だ。
会話での使われ方

ペネトレーションテストで../を使ったディレクトリトラバーサルを試したら、開発環境の設定ファイルが丸見えでした。本番は大丈夫でしたが修正が必要です。
セキュリティエンジニアが脆弱性診断の結果を開発チームに報告している場面。ペネトレーションテストで発見された問題を共有している。




ファイルダウンロード機能を実装するとき、ユーザー入力をそのままファイルパスに使わないでください。IDからパスを引くホワイトリスト方式にしてください。
シニアエンジニアがコードレビューでセキュアなファイル処理の実装方法を指導している場面。設計レベルでの対策を伝えている。




WAFを入れてからディレクトリトラバーサルのパターンが自動でブロックされるようになりました。ログを見るとほぼ毎日試行があるんですよ。
インフラエンジニアがWAF導入後の効果をチームに報告している場面。攻撃が実際に頻繁に試みられていることをログで確認している。
【まとめ】3つのポイント
- 入力値の検証がセキュリティの最初の砦:ユーザーから受け取った文字列をファイルパスに直接使わず、ホワイトリストバリデーションまたはIDによるマッピング方式に設計することが根本的な対策になる
- URLエンコードを含む多様な迂回手法に対応が必要:単純な文字列マッチングでは回避されるため、URLデコード後の値を検証しWAFを組み合わせた多層防御で守ることが現実的な対策だ
- 脆弱性診断で定期的に検出・修正するサイクルを回す:OWASP Top 10に含まれる代表的な脆弱性であり、開発時のセキュアコーディングと定期的なペネトレーションテストで継続的に管理することが重要だ
よくある質問
-
Qディレクトリトラバーサルとパストラバーサルは違いますか?
-
A
同じ攻撃を指す別名です。どちらも「../を使ってアクセス権限外のディレクトリに侵入する攻撃」を表しており、文脈によって使い分けられているだけで本質的な違いはありません。
-
QOWASP Top 10のどのカテゴリに該当しますか?
-
A
OWASP Top 10 2021では「A01:2021 – Broken Access Control(アクセス制御の不備)」カテゴリに分類されます。アクセス制御の問題として最も重大なカテゴリのひとつです。
-
QPHPでの基本的な対策実装を教えてください。
-
A
basename()関数でファイル名のみを抽出してディレクトリ部分を除去し、realpath()で絶対パスを取得してドキュメントルート内に収まっているかを確認する方法が基本です。設計レベルでファイルパスをユーザー入力から生成しない方式が最も安全です。
-
QディレクトリトラバーサルとSQLインジェクションの違いは何ですか?
-
A
どちらも入力値検証不備を突く攻撃ですが標的が異なります。SQLインジェクションはデータベースへの不正SQL実行、ディレクトリトラバーサルはファイルシステムへの非公開ファイルアクセスが目的です。
この用語と一緒に知っておきたい用語
| 用語 | この記事との関連 |
|---|---|
| 脆弱性 | 脆弱性は関連分野でよく登場する重要キーワードです。ソフトウェア・ハードウェア・ネットワーク設定などに存在するセキュリティ上の欠陥・弱点のこと。攻撃者に発見・悪用されると不正アクセスや情報漏洩につながる |
| エンコード | 次のステップとしてエンコードを学ぶと知識が広がります。データを特定のルールに従って、別の形式に変換する処理のことだよ! |
| ペネトレーションテスト | ペネトレーションテストは関連分野でよく登場する重要キーワードです。組織の許可を得た上で実際のハッカーと同じ攻撃手法を使いシステムへの侵入を試みるセキュリティテスト。侵入できた場合の被害範囲・経路を特定して改善につなげる |
| ドキュメントルート | ドキュメントルートを押さえると本記事の理解がさらに深まります。Webサーバーが外部に公開するファイル群の基点となる最上位ディレクトリのこと。WebブラウザのURLで指定したパスは、このディレクトリを起点としてサーバー内部のファイルに対応付けられる |
| ダウンロード | ダウンロードは関連分野でよく登場する重要キーワードです。インターネット上にあるファイルやデータを、自分のパソコンやスマホに取り込んで保存する操作、それがダウンロードだ |
【出典】参考URL
https://cybersecurity-jp.com/column/90882 :ディレクトリトラバーサル攻撃のリスクと防止策
https://act1.co.jp/column/0055-2/ :ディレクトリトラバーサル攻撃の仕組みと対策事例
https://www.lanscope.jp/blogs/cyber_attack_pfs_blog/20231128_16893/ :ディレクトリトラバーサルの対策と脆弱性診断


コメント