ファイルインクルージョンの理解
ここでは、「ファイルインクルージョン」の概念と、特に初心者向けに特化したその潜在的な脆弱性について掘り下げていきましょう。
ファイルインクルージョンは、特にコードの再利用性の観点から、プログラミングにおいて一般的な手法です。開発者は、頻繁に使用される関数やモジュールを別個のファイルにカプセル化することがよくあります。これらの関数やモジュールが必要な場合、コード内でこれらのファイルをインクルードするだけで、同じコードを繰り返し記述する必要がなくなります。
PHP には、ファイルインクルージョンのための主要な 4 つの関数があります。
include()
require()
include_once()
require_once()
それぞれの簡単な概要は以下の通りです。
include(): この関数は、呼び出されたときにファイルをインクルードします。ファイルが見つからない場合、PHP は警告を発しますが、スクリプトの実行は継続されます。
require(): この関数は、スクリプトの実行開始前にファイルをインクルードします。ファイルが見つからない場合、PHP は致命的なエラーを発行し、スクリプトを停止します。
include_once() および require_once(): これらの関数は include() および require() と同様に機能しますが、関数が複数回呼び出された場合でも、ファイルが一度だけインクルードされることを保証します。
ファイルインクルージョンの方法は、大きく分けて 2 つのタイプに分類できます。
- 静的インクルージョン (Static inclusion)
- 動的インクルージョン (Dynamic inclusion)
これら 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 の例ですが、使用される特定の関数は異なる場合があるものの、その原則は他のプログラミング言語にも適用されることを覚えておくことが重要です。