ディレクトリトラバーサルとは?対策の方法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も、費用対効果などを見積もった上で導入するのが賢明でしょう。
ネプラス株式会社はサービス開始から10年以上
『エンジニアの生涯価値の向上』をミッションに掲げ、
多くのインフラエンジニア・ネットワークエンジニアの就業を支援してきました。
ネプラス株式会社はこんな会社です
秋葉原オフィスにはネプラス株式会社をはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
インフラ業界に特化
ネットワーク・サーバー・データベース等、ITインフラ業界に特化。Cisco Systemsプレミアパートナーをはじめ各種ベンダーのパートナー企業です。
業界を知り尽くしているからこそ大手の取引先企業、経験豊富なエンジニアに選ばれています。
-
正社員なのにフリーランスのような働き方
正社員の方でも希望を聞いたうえでプロジェクトをアサインさせていただいており、フリーランスのような働き方が可能。帰社日もありません。
プロジェクト終了後もすぐに次の案件をご紹介させていただきますのでご安心ください。
-
大手直取引の高額案件
案件のほとんどが大手SIerやエンドユーザーからの直取引のためエンジニアの皆様へに高く還元できています。
Ciscoをはじめ、Juniper、Azure、Linux、AWS等インフラに特化した常時300件以上の案件があります。
-
スキルアップ支援
不要なコストを削減し、その分エンジニアの方へのスキルアップ支援(ネットワーク機器貸出、合格時の受験費用支給など)や給与で還元しています。
受験費用例)CCNP,CCIE:6-20万円、JNCIS:3-4万円、AWS:1-3万円など
※業務に関連する一定の資格のみ。各種条件がありますので詳しくは担当者へにお尋ねください。
-
現給与を保証します!※
前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。
※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。
-
インセンティブ制度
ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。
取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。
-
社会保険・福利厚生
社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。
さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。
-
東証プライム上場企業グループ
ネプラスは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
ネプラス株式会社に興味を持った方へ
ネプラス株式会社では、インフラエンジニアを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
オンライン面接も随時受付中。ぜひお気軽にご応募ください。

