PHP セキュリティ解説 · 防御向け
PHP ファイルインクルード(LFI/RFI)とは?直し方
include と require は渡されたファイルをそのまま実行します。パスの一部がリクエストから来るなら、何を実行するかを訪問者が決めていることになります。
最終更新
どんな問題か
ローカルファイルインクルード(LFI)では、設定ファイルやログなどサーバー上の既存ファイルを include や require に読み込ませられます。アップロードやログ書き込みと組み合わさるとコード実行になり得ます。リモートファイルインクルード(RFI)は別サーバーのコードを読み込むもので、allow_url_include が有効なときだけ成立し、php.net によれば既定は無効です。MITRE では CWE-98 に分類されます。
見つけ方
- 引数に変数を含む
include、require、include_once、require_onceを検索し、その変数をリクエストデータまで遡ります。 php -iでallow_url_includeが Off か、open_basedirが設定されているか確認します。- Web サーバーのログで、パラメータに
../やphp://、data:を含むリクエストを確認します。探索の痕跡であって侵害の証拠ではありません。
直し方
- 入力からインクルードパスを組み立てず、許可したキーを固定ファイル名に対応させます(下の例)。
allow_url_include = Offを維持し、リモート読み込みが不要ならallow_url_fopen = Offも検討します。open_basedirをサイトのディレクトリに設定し、ほかの場所のファイルを開けないようにします。- アップロードファイルはドキュメントルートの外に置き、決して include しません。
読み取り専用の確認と安全な書き方
# Find include/require with a variable path (read-only)
grep -rnE "(include|require)(_once)?\s*\(?\s*\$" --include=*.php . | grep -v /vendor/
php -i | grep -E "allow_url_include|allow_url_fopen|open_basedir"
; php.ini hardening
allow_url_include = Off
open_basedir = /var/www/example:/tmp
// Map user choices to fixed files instead of building paths
$pages = ['home' => 'home.php', 'about' => 'about.php'];
require __DIR__ . '/pages/' . ($pages[$_GET['p'] ?? 'home'] ?? 'home.php');basename() を通せば include は安全ですか?
ディレクトリ部分は消えますが、そのディレクトリ内のどのファイルでも選べてしまいます。明示的な許可リストのほうが安全です。
今の PHP でも RFI は危険ですか?
allow_url_include を有効にしている場合だけです。LFI は特別な設定が要らないため今もよく見られます。
ほかの PHP の脆弱性の種類
- PHP オブジェクトインジェクションとは?直し方PHP オブジェクトインジェクションは、利用者が操作できる入力が unserialize() に届くと起き、マジックメソッドを通じて攻撃者が選んだ処理を実行させるオブジェクトが生成され得ます。
- PHP の SSRF とは?直し方サーバーサイドリクエストフォージェリ(SSRF)は PHP アプリが利用者の指定した URL を取得すると起き、攻撃者はサーバー経由で内部サービスやクラウドのメタデータに到達できます。
- PHP の XSS とは?防ぎ方クロスサイトスクリプティング(XSS)は PHP のページが利用者の操作できるデータをエスケープせずに HTML に出すと起き、攻撃者のスクリプトがほかの訪問者のブラウザで実行されます。
- phpinfo() の露出:なぜ問題か、どう直すか公開された phpinfo() ページは正確な PHP のバージョン、読み込まれたモジュール、ファイルパス、しばしば環境変数や秘密情報まで明かし、PHP2Shell のような脆弱性を狙う手がかりになります。
出典
外部リンクは本サイトの外に移動します。本サイトはエクスプロイトコードを掲載しません。
- CWE-98: PHP Remote File Inclusion — MITRE CWE
- Testing for Local File Inclusion — OWASP Web Security Testing Guide
- Filesystem runtime configuration (allow_url_fopen, allow_url_include) — PHP Manual
- Core php.ini directives (open_basedir, expose_php) — PHP Manual