ディレクトリトラバーサルとは?対策の方法7選と主な被害例3つをご紹介!

ディレクトリトラバーサルとは?対策の方法7選と主な被害例3つをご紹介!のアイキャッチイメージ

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

ディレクトリトラバーサルとは、「”../etc/passwd””」というように上層に遡ってパスを指定することて、不正にファイルにアクセスする、攻撃手法の一つです。

UNIXのようなファイルシステムだけでなく、WebページのURLにおいても、ホームからのファイルのパスを指定して表示しています。よって、ブラウザ上で、URL中に不正なパスを入力することでも、ディレクトリトラバーサルを行うことができます。

絶対パス

絶対パスとは、ルートディレクトリから指定したパスのことです。

UNIXの場合は、「””/””」で始まります。現在いるディレクトリ(カレントディレクトリ)に関わらず、常に同じディレクトリを参照できます。

UNIXでは、カレントディレクトリの絶対パスは、pwdコマンドで表示することができます。ブラウザにおいては、上部のアドレスバーに表示されているURLが絶対パスです。

相対パス

相対パスとは、カレントディレクトリから指定したパスのことです。

先頭に「””/””」をつけない場合、相対パスとなります。ひとつ上のディレクトリは、「””..””」で表します。UNIXの場合、例えば、カレントディレクトリのひとつ上にある「””foobar””」というディレクトリに移動するときには、「$ cd ../foobar」のように指定します。

ディレクトリトラバーサル攻撃は、この「””../””」を悪用して行われます。

ディレクトリトラバーサルの対策方法7つ

ディレクトリトラバーサルは、ユーザーから与えられた入力に対して不正ではないかどうかを判定したり、保存するファイルの名前を工夫することなどによって、防止することができます。ここでは、具体的に7つの防止策を紹介します。

方法1:ファイル名を外部からのパラメータで指定しない

ファイル名を、外部からのパラメータで直接入力させない方法があります。

一つの方法としては、入力パラメータと実際のファイル名の間に、対応するテーブルを設定する方法です。入力をキー、値を番号などとしたハッシュを作成します。実際のファイル名はハッシュの値に合わせます。

もし不正な入力がされても、ハッシュにキーが存在しないというエラーとなるだけなので、これによってディレクトリトラバーサルを防止できます。

方法2:攻撃を受けたときに都度検知する

公開していないファイルにおいて、アクセス時刻などの解析を一定時間ごとに行うなどして、ディレクトリトラバーサル攻撃を検知する方法があります。

攻撃を受けた後に生じる被害を防ぐことはできませんが、対策していても想定外の方法で攻撃される恐れがあるため、新たな対策手法を打ち出すのには効果的でしょう。

方法3:ファイルに権限をつける

ファイルには読み取り(R)、書き込み(W)、実行(X)の権限が設定されています。この設定を、ディレクトリトラバーサルを受けそうなファイルに設定します。

UNIXでは、chmodコマンドを用いて、「所有者」「所有グループ」「それ以外」の3つについて、RWXのそれぞれを2進数のビットとみて指定します。例えば「../private」ディレクトリを自分以外には参照されないようにするには、「$ chmod 700 ../private」と指定します。

方法4:「/」などを含むパス名の禁止

ディレクトリトラバーサル攻撃は、カレントディレクトリ以外に移動して不正にアクセスする行為です。よって、入力にディレクトリに該当する部分が含まれている、すなわち「””/””」などの区切り文字が含まれている場合には、入力を受け付けないという手法があります。

方法5:「WAF」を導入する

WAFとは、Web Application Firewallの略です。WAFは、不正な通信をブロックするシステムで、サーバの前に置かれる要塞のような役目をしています。

WAFによって、サーバ外部からの通信について、ディレクトリトラバーサルの攻撃をするような内容が含まれていないかなどを検査し、通信の可否を判定します。

代表的なWAFとしては、「ModSecurity」「WebKnight」などがあります。

方法6:ファイル名をハッシュ化する

ファイル名を、「SHA256」などのアルゴリズムでハッシュ文字列に変換しておきます。

ここで、入力に対して同じアルゴリズムでハッシュ文字列に変換し、一致したファイルを参照するように設定します。

こうすれば、意図しないファイルが指定されても、英数字だけのハッシュ文字列に変換され、カレントディレクトリないしか探さないため、ディレクトリトラバーサルを防ぐことができます。

方法7:入力パスの最後のファイルを参照する

入力パスから最後のファイルを抽出してアクセスする方法があります。

この場合、入力に「””/””」などの区切り文字が含まれていても、カレントディレクトリにある、最後のファイル名だけが参照され、ディレクトリトラバーサルを防ぐことができます。

例えば、「””../etc/password””」という入力があった場合、「””password””」と変換して参照させます。PHPでは、basename関数を用いると可能です。

ディレクトリトラバーサルの被害例3つ

ディレクトリトラバーサルによって、本来は公開していないファイルにアクセスすることが可能となります。攻撃を受けると、自分の提供するサービスに被害が及ぶだけでなく、利用するユーザーにも直接的、間接的な被害を及ぼすことにもなりかねません。

ディレクトリトラバーサルによる被害は、具体的には次の3つに大きく分けることができます。

被害例1:情報漏洩

ディレクトリトラバーサルによって、不正に閲覧され情報が漏洩する恐れがあります。さらに、その情報をダウンロードして保存される可能性もあるので、攻撃者以外の第三者にも情報が漏洩する恐れもあります。

被害例2:データの改ざん

ディレクトリトラバーサルによって、不正にファイルを編集することが可能となり、ファイルが改竄されたり、削除されたりする恐れがあります。

ユーザー情報を管理するファイルの場合、アカウントが勝手に削除されたり、パスワードが変更されたりして、ユーザーがログイン不能になるなどの被害が起こる可能性があります。

また、過去からの長年に渡るデータなど、サービスを提供するために必要不可欠なファイルそのものを削除され、運営が破綻する可能性もあります。この被害は、ファイルに対して書き込み権限を与えている場合に発生します。

被害例3:乗っとり

ディレクトリトラバーサルによって、サービス管理用のページに不正にアクセスされ、システムの設定などを勝手に変更される恐れがあります。

また、ユーザー情報を管理するファイルにアクセスされた場合、そこに含まれるIDやパスワードから他人になりすましてログインすることも可能となるので、ユーザー側にも被害を及ぼす可能性があります。

さらに、Yahoo!やTwitterなど他のサービスと連携させるための情報が含まれている場合、それらのサービスまで乗っ取られる可能性もあります。

Webアプリケーションに行われる攻撃の種類3つ

ディレクトリトラバーサルの他にも、Webアプリケーションの脆弱性を狙った攻撃はいくつかあります。これらには、攻撃者が実装した任意のコードを実行できるという危険性があります。ここでは、それらの中から3つ紹介します。

種類1:SQLインジェクション

SQLインジェクションとは、入力中にSQL文を含めて、データベースに不正な操作を行う攻撃です。例えば、次のようなSQL文があるとします。「SELECT * FROM mytable WHERE uname='$uname'

ここで、$unameはユーザーが入力する部分です。ここで、「$uname」に、「””‘;DELETE FROM mytable –“”」と入力された場合、「SELECT * FROM mytable WHERE uname='';DELETE FROM mytable--'」と展開され、表が削除される恐れがあります。

この攻撃には、「””;””」などの特殊文字が含まれている場合には、入力を受け付けないなどの対策法があります。

種類2:クロスサイトスクリプティング

クロスサイトスクリプティングは、アンケートなど、URLにスクリプトが埋め込まれているようなサイトを標的に行われます。

攻撃者は、標的サイトのURLに不正なスクリプトを埋め込んで、リンクを掲載します。

そこで、ユーザーはそのリンクからアクセスしたときに、ユーザーのブラウザ上で、その不正なスクリプトが実行されます。スクリプトには、アンケートに似せたフォームを表示させて、そこから情報を盗み出すというものがあります。

この攻撃には、不正な文字列が含まれていないかの確認や、ユーザからのリクエスト内容を確認するWAFを導入するという対策法があります。これらの両方を行うと、防御がより強固となります。

種類3:強制ブラウジング

強制ブラウジングとは、Web上において、「””data.html””」「””user.html””」など、URL名を推測して直接アクセスし、公開していないコンテンツを不正に閲覧する攻撃です。

また、認証が必要なページの場合、認証を経ることなく想定外の画面遷移を行う行為も含まれます。

この攻撃には、閲覧の権限を設定したり、ファイル名に、他人には推測できない文字列を付加したりするなどという対策法があります。

ディレクトリトラバーサルについて知り適切な対策をしよう!

本記事においては、ディレクトリトラバーサルとは、「”../””」を用いて上層からのパスを指定することで、不正なファイルにアクセスする攻撃手法であることを紹介しました。

また、その対策として7つの方法を紹介しました。ユーザーの入力をチェックする方法を紹介しましたが、それだけではシステム上の欠陥が生じる恐れがあります。

よって、入力チェックなどの簡易的な対策に加えて、通信を監視するWAFも、費用対効果などを見積もった上で導入するのが賢明でしょう。

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。