ディレクトリ・トラバーサルとファイルインクルードとの違い
※当サイトにはプロモーションが含まれています。
公開日:
更新日:

Webアプリケーションのセキュリティに関して、
- ディレクトリ・トラバーサル
- ファイルインクルード
という言葉があります。この2つ違いが分かりにくいと感じているので、その辺りについてメモしておきます。
ディレクトリ・トラバーサル (Directory traversal)
- ユーザ入力値に対するバリデーションが適切に行われていないために、アプリケーションが意図していないファイルを読み込んでしまうことを指します。
- どのように読み込まれるかは問いません。
- ローカル上のファイルが読み込まれることを想定しています。
- どんな文字列を入力するかは問いません。
- よく使用される文字列
- ../(ピリオドとスラッシュ)
- 絶対パス
- NULLバイト
- よく使用される文字列
- 入力値としてピリオド・スラッシュ(例: “../”)を使うことをディレクトリ・トラバーサル攻撃と呼ぶこともあるようです。
ファイルインクルード (File inclusion)
- ユーザ入力値に対するバリデーションが適切に行われていないために、アプリケーションが使用しているスクリプト言語のinclude系関数で、アプリケーションが意図していないファイルを読み込んでしまうことを指します。
- PHPの場合
- include()系関数がいくつもあります。
- 読み込まれたファイルがPHPスクリプトの場合、そのプログラムが実行されてしまいます。
- RFIとLFIの2種類あります。
- RFI (Remote File Inclusion)(リモート・ファイルインクルード)
- ファイル(パス)としてURL文字列を指定することによって、外部サーバ上のファイルを読み込んでしまう脆弱性です。
- LFI (Local File Inclusion)(ローカル・ファイルインクルード)
- 外部サーバ上のファイルではなく、ローカル上のファイルを読み込んでしまう脆弱性です。
- RFI (Remote File Inclusion)(リモート・ファイルインクルード)
2つの違い
- アプリケーションが使用しているスクリプト言語の include系関数でファイルが読み込まれるならファイルインクルードです。
- 本来、ディレクトリ・トラバーサルの定義はLFIの定義を包含していますが、その時対象にしている脆弱性がLFIに該当するのであれば、LFIが使われるようです。
- リモートにあるファイルをinclude系関数以外の方法で読み込む手法があれば、それはディレクトリ・トラバーサルでもファイルインクルードでもありません。別の新たな脆弱性だと思われます。
備考
- ファイルインクルード脆弱性の”インクルード”の部分が、英語だとinclusionになっています。日本語でも”インクルージョン”が使われていることはあるのですが、こちらは少数派のようです。
- 間違いがありましたらご指摘下さい。
参考
[最終更新日: 2014年3月9日]