Web アプリケーションにおけるファイルインクルージョン脆弱性の理解

Beginner

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このコースは初心者にも親和的なウェブアプリケーションの脆弱性に関するコースで、特にウェブアプリケーションで最も一般的な問題の一つであるファイルインクルージョン脆弱性に焦点を当てています。

このモジュールでは、まずウェブアプリケーションにおける「ファイルインクルージョン」の概念を詳しく解説します。その上で、「ファイルインクルージョン脆弱性」とは何かを明らかにします。最後に、ファイルインクルージョン脆弱性の 2 つの主要なカテゴリーについて掘り下げます。

このモジュールの次のセクションでは、「ローカルファイルインクルージョン脆弱性 (Local File Inclusion Vulnerabilities)」と「リモートファイルインクルージョン脆弱性 (Remote File Inclusion Vulnerabilities)」についてさらに詳しく学び、これらの重要なセキュリティ問題を包括的に理解することができます。

主な学習成果
  • ウェブアプリケーションにおけるファイルインクルージョンの基本概念を理解する。
  • ファイルインクルージョン脆弱性の根本原理を把握する。
  • ファイルインクルージョン脆弱性の 2 つの主要なタイプ(ローカルとリモート)について学ぶ。

Skills Graph

ファイルインクルージョンの理解

初心者向けに、「ファイルインクルージョン」の概念とその潜在的な脆弱性について詳しく見ていきましょう。

ファイルインクルージョンは、特にコードの再利用性の観点から、プログラミングにおいて一般的な手法です。開発者は頻繁に使用する関数やモジュールを別のファイルにまとめます。これらの関数やモジュールが必要になったとき、開発者は単にそれらのファイルをコードに含めるだけで、同じコードを繰り返し書く必要がなくなります。

PHP には、ファイルインクルージョンに関する 4 つの主要な関数があります。

  1. include()
  2. require()
  3. include_once()
  4. require_once()

以下にそれぞれの概要を簡単に説明します。

  • include(): この関数は、呼び出されたときにファイルを含めます。ファイルが見つからない場合、PHP は警告を発しますが、スクリプトは引き続き実行されます。
  • require(): この関数は、スクリプトが実行される前にファイルを含めます。ファイルが見つからない場合、PHP は致命的なエラーを発し、スクリプトの実行を停止します。
  • include_once()require_once(): これらの関数は include()require() と同様に動作しますが、関数が複数回呼び出された場合でも、ファイルが一度だけ含まれることを保証します。

ファイルインクルージョンの方法は大きく 2 つのタイプに分類できます。

  1. 静的インクルージョン
  2. 動的インクルージョン

これら 2 つのタイプの違いについては、次のセクションで例を用いて説明します。

このコースでは、/home/labex/project/ ディレクトリにある 3 つの .php ファイルを探索します。これらは次の通りです。

  • lfi_static.php
  • lfi_dynamic.php
  • echo.php

それぞれのファイルが何をするかを理解しましょう。

  • lfi_static.php: このファイルは echo.php ファイルを静的に含めます。つまり、echo.php ファイルへのパスはハードコードされており、変更されません。この方法は安全で、脆弱性を露出することはありません。

    <?php
    include("./echo.php");
    ?>
  • lfi_dynamic.php: このファイルは、URL の 'file' パラメータに基づいて他のファイルを含めます。このパラメータが提供されない場合、単にその使い方のヒントを表示します。ただし、このパラメータが攻撃者によって制御される場合、この方法は危険な可能性があります。

    <?php
    if (isset($_GET['file'])) {
        include($_GET['file']);
    }
    else{
        echo "You can use the 'file' parameter to include files";
    }
    ?>
  • echo.php: このファイルは、含められたときに単に成功メッセージを出力します。

    <?php
    echo 'Great, now you have successfully included the content of echo.php!'
    ?>

次のコマンドをターミナルで実行して、lfi テスト用のイメージを準備します。

cd ~/projects
docker build -t lfi-image.

イメージのビルドが完了したら、このイメージを使用して lfi 脆弱性をテストするためのコンテナを起動できます。

docker run -d --name lfi -p 80:80 lfi-image

これで、ブラウザでこれらのファイルをテストできます。たとえば、lfi_static.php ファイルにアクセスするには、次の URL を入力します。

http://127.0.0.1/LFI/lfi_static.php

lfi_static.php ファイルが echo.php の内容を正常に含めていることがわかります。この静的なファイルインクルージョンの方法は安全であることを覚えておいてください。

次に、lfi_dynamic.php ファイルを見てみましょう。次の URL を使用してこのファイルにアクセスします。

http://127.0.0.1/LFI/lfi_dynamic.php

'file' パラメータを使用するように促すメッセージが表示されます。それでは、これを行い、echo.php を含めましょう。

http://127.0.0.1/LFI/lfi_dynamic.php?file=./echo.php

echo.php が正常に含められていることがわかります。これは、ファイルインクルージョンがどのように機能するかを示しています。これは PHP の例ですが、特定の関数は異なる場合がありますが、その原則は他のプログラミング言語にも適用されることを覚えておくことが重要です。

ファイルインクルージョン脆弱性の理解

先ほど、lfi_dynamic.phpfile パラメータを使って echo.php ファイルをインクルードする方法を学びました。では、次の疑問が生じます。

file パラメータを使って他のファイルをインクルードすることは可能でしょうか?

答えは、間違いなく「可能です」です!

もしウェブ開発者が file パラメータの検証を怠ると、サーバ上にある機密ファイルをインクルードするためにこのパラメータが悪用される可能性があります。

以下にいくつかの例を示します。

  • Linux システムでは、/etc/passwd ファイルをインクルードできる可能性があります。
  • Windows システムでは、C:\Windows\System32\drivers\etc\hosts ファイルをインクルードできる可能性があります。

例を挙げて説明しましょう。file パラメータを /etc/passwd に設定するとします。

http://127.0.0.1/LFI/lfi_dynamic.php?file=/etc/passwd

この URL をブラウザで開くと、/etc/passwd ファイルの内容が正常にインクルードされ、表示されることがわかります。これは、ローカルファイルインクルージョン (Local File Inclusion, LFI) 脆弱性が存在することを示しており、深刻なセキュリティ問題です。

これらの脆弱性を理解することが、それらを防止するための第一歩であることを忘れないでください。ウェブアプリケーションにおいては、常にすべてのユーザ入力を検証し、サニタイズするようにしてください。

ファイルインクルージョン脆弱性の種類

ファイルインクルージョン脆弱性は、ウェブセキュリティにおける重大な問題であり、一般的に 2 つの主要なタイプに分けられます。

  1. ローカルファイルインクルージョン (Local File Inclusion, LFI): このタイプの脆弱性は、対象サーバ上のローカルファイルがインクルードされる場合に発生します。

  2. リモートファイルインクルージョン (Remote File Inclusion, RFI): このタイプの脆弱性は、別のリモートサーバ上にあるファイルがインクルードされる場合に発生します。

先ほど議論した例では、ローカルの /etc/passwd ファイルのインクルージョンは、ローカルファイルインクルージョン (LFI) 脆弱性の典型的な例です。これら 2 種類の脆弱性の違いを理解することは、ウェブアプリケーションを効果的にセキュアにするために重要です。

まとめ

この実験では、ファイルインクルージョン機能を通じて攻撃を開始する方法とプロセスを学びました。このセクションでカバーされた重要なポイントを振り返りましょう。

  • ファイルインクルージョンとは何か?
  • ファイルインクルージョン脆弱性とは何か?
  • ファイルインクルージョン脆弱性の 2 種類は何か?