PHP セキュリティ解説 · 防御向け
phpinfo() の露出:なぜ問題か、どう直すか
phpinfo() は PHP の設定をすべて表示します。サーバー構築中は便利ですが、公開したまま残すと攻撃者への贈り物になります。
最終更新
どんな問題か
PHP マニュアルによれば phpinfo() はコンパイルオプション、拡張、PHP のバージョン、サーバー情報、環境変数、HTTP ヘッダーなど PHP の現在の状態について大量の情報を出力します。本番サイトでは、データベースのホスト名、環境変数に置いた API キー、内部パスが含まれることがあります。MITRE ではこれを CWE-200(機密情報の露出)に分類します。
見つけ方
- ドキュメントルートで
phpinfo(を呼ぶファイルや、info.php、phpinfo.php、test.phpといった名前を検索します。 - 自分のサイトでそれらの名前にアクセスし、200 が返るか確認します。自分のものでないサイトはスキャンしないでください。
X-Powered-Byヘッダーに PHP のバージョンが出ていないか確認します。これはexpose_phpで制御されます。
直し方
- 本番環境から phpinfo ファイルを削除します。情報が必要ならサーバーで
php -iを実行するか、認証付きの一時ページにして使ったら消します。 - どのアプリも使わないなら php.ini の
disable_functionsにphpinfoを追加します。 expose_php = Offでレスポンスヘッダーからバージョンを消します。- 公開された phpinfo ページに表示された秘密情報は、誰が見たかわからないため、すべてローテーションします。
読み取り専用の確認と安全な書き方
# Find leftover phpinfo() files (read-only)
grep -rln "phpinfo\s*(" --include=*.php /var/www 2>/dev/null | grep -v /vendor/
# Check your own site for common file names (only on hosts you own)
for f in phpinfo.php info.php test.php i.php; do
curl -s -o /dev/null -w "%{http_code} $f\n" "https://your-site.example/$f"
done
; php.ini: stop advertising the version and block the function
expose_php = Off
disable_functions = phpinfoPHP のバージョンが見えるのは本当に問題ですか?
それ自体は脆弱性ではありませんが、サーバーがまだ 8.2.35・8.3.36・8.4.27・8.5.12 より前かどうかを攻撃者に教えてしまいます。消すのにコストはかかりません。
ホスティングのコントロールパネルで phpinfo が見えます。露出ですか?
パネルのログインの内側なら露出ではありません。問題は認証なしでアクセスできる phpinfo ページです。
ほかの PHP の脆弱性の種類
- PHP オブジェクトインジェクションとは?直し方PHP オブジェクトインジェクションは、利用者が操作できる入力が unserialize() に届くと起き、マジックメソッドを通じて攻撃者が選んだ処理を実行させるオブジェクトが生成され得ます。
- PHP ファイルインクルード(LFI/RFI)とは?直し方ファイルインクルードは利用者の入力が include や require のパスを左右すると起き、攻撃者はローカルファイルを読み(LFI)、allow_url_include が有効ならリモートのコードを実行できます(RFI)。
- PHP の SSRF とは?直し方サーバーサイドリクエストフォージェリ(SSRF)は PHP アプリが利用者の指定した URL を取得すると起き、攻撃者はサーバー経由で内部サービスやクラウドのメタデータに到達できます。
- PHP の XSS とは?防ぎ方クロスサイトスクリプティング(XSS)は PHP のページが利用者の操作できるデータをエスケープせずに HTML に出すと起き、攻撃者のスクリプトがほかの訪問者のブラウザで実行されます。
出典
外部リンクは本サイトの外に移動します。本サイトはエクスプロイトコードを掲載しません。
- phpinfo() — PHP Manual
- Core php.ini directives (open_basedir, expose_php) — PHP Manual
- CWE-200: Exposure of Sensitive Information to an Unauthorized Actor — MITRE CWE