結論(CMSセットアップ/管理入口の露出)
CMSセットアップ/管理入口の露出とは、WordPressやJoomlaなどのCMSの初回インストール用セットアップ画面や管理者ログイン画面が、インターネットから誰でも到達できる状態です。未完了のセットアップ画面は第三者に先にインストールを完了され、管理者を作られてサイトを乗っ取られるため特に危険です。セットアップは非公開のまま完了させ、管理入口は接続元IP制限と多要素認証で守るのが対策です。
この記事のポイント
- 未完了のセットアップ画面(WordPressのsetup-config.php・install.php、Joomlaのinstallation)は、誰でも管理者を作成できる重大な状態です。
- WordPressのinstall.phpは完了後も200で「Already Installed」を表示するため、200応答だけでは未完了とはいえません。
- 管理ログイン画面は存在だけでは脆弱性ではなく、総当たり対策・多要素認証・接続元制限の欠如が危険の本質です。
- セキュリティAIチェッカーは3つの既知パスの内容署名で、未完了のセットアップを×、管理入口の公開を△と判定します。
- IP制限は、テレワークや委託先の保守回線、CDN経由の構成を洗い出してから適用します。
| 診断項目名 | CMSセットアップ/管理入口の露出 |
|---|---|
| 項目ID | public.cms-setup-surface |
| 分類 | 公開ファイル・情報露出 |
| 重大度・配点の重み | 中(medium) 重み 2 |
| 関連する標準・ガイドライン | OWASP ASVS 5.0.0 V15.2.3(本番環境に不要な機能・開発用機能を公開しない)、V6.3.2(既定の管理者アカウントを無効化)、V6.3.3(多要素認証)、V8.4.2(管理インターフェースへの多層防御、L3)、OWASP WSTG-CONF-05(Enumerate Infrastructure and Application Admin Interfaces)、CWE-306(Missing Authentication for Critical Function)、CWE-200 |
CMSセットアップ/管理入口の露出とは
CMSセットアップ/管理入口の露出とは、WordPress や Joomla などのCMS(コンテンツ管理システム)の、初回インストール用のセットアップ画面や管理者ログイン画面が、インターネットから誰でも到達できる状態です。
CMSには、初回インストール用のセットアップ画面と、管理者ログイン画面があります。セットアップが完了していない状態でセットアップ画面がインターネットから到達できると、第三者が先にインストールを完了させ、管理者アカウントを作ってサイトを乗っ取ることができます。管理ログイン画面は存在自体は脆弱性ではありませんが、パスワード総当たりやリスト型攻撃の入口になります。
セキュリティAIチェッカーのこの項目は、代表的なCMSのセットアップ画面・管理入口の既知パスへ安全なGETを送り、応答の内容署名から「未完了のセットアップ画面」(× 要改善)と「管理ログイン入口の公開」(△ 要確認)を区別します。
CMSのセットアップ画面と管理入口はどう動くのか(仕組み)
WordPress のセットアップ処理
WordPress のソースコード(wp-load.php)では、wp-config.php が存在しない場合、/wp-admin/setup-config.php へ Location ヘッダーでリダイレクトします(PHPの header('Location: ...') は302になります)。setup-config.php では、データベース接続情報を入力させて wp-config.php を作成します。
wp-config.php があり、データベースが空の場合は /wp-admin/install.php が言語選択フォーム(<form id="setup" method="post" action="?step=1">)またはサイト名・管理者ユーザーの入力フォーム(name="weblog_title" を含む <form id="setup" ... action="install.php?step=2">)を表示します。
完了済みでも install.php は200を返す
インストール完了後に install.php を開くと、<title>WordPress › Installation</title> を含むヘッダーとともに「Already Installed」と表示して処理を終了します。このときHTTPステータスは200のままです。つまり、タイトルに「Installation」とあることや200応答であることだけでは、セットアップが未完了とはいえません。完了済みの表示は、WordPressの利用と install.php が到達可能であることを示す情報にとどまります。
Joomla の管理入口とインストーラー
Joomla 4〜6 の管理テンプレート(atum)のログイン画面は、<body class="admin com_login view-login ..."> と、id="form-login"、id="mod-login-username" のフォームを出力します。/administrator/ で200とこれらの署名が返れば、管理入口が公開されています。
Joomla のソースコード(administrator/includes/framework.php)では、configuration.php がない(または10バイト未満)場合や、正式版で installation フォルダーが残っている場合、/administrator/ へのアクセスを Location: ../installation/index.php でインストーラーへリダイレクトします。このリダイレクトは、セットアップが未完了であることを示します。
CMSの管理画面についてよくある誤解
- 「管理画面のURLを変えれば安全」:URL変更は自動スキャンの一部を避けるだけです。認証の強度と接続元制限が本質的な対策です。
- 「ログイン画面の存在=脆弱性」:存在だけでは脆弱性ではありません。総当たり対策・多要素認証・接続元制限が欠けている場合に危険になります。本項目でもログイン入口は △ にとどめています。
API仕様書やGraphQLの開発画面の公開は「API仕様・GraphQL開発画面の公開」、旧版のログイン画面やテスト画面の残存は「旧版・別ログイン・テスト画面の露出」で別に確認します。このページはCMSのセットアップ画面と管理入口に絞って解説します。
CMSセットアップ/管理入口の露出の診断基準(セキュリティAIチェッカー)
取得対象
次の3パスへ、リダイレクトを追わないGETを1回ずつ送ります(追加診断のリクエスト予算40件の範囲内)。
| パス | 想定 |
|---|---|
/wp-admin/install.php | WordPress のインストール画面 |
/wp-login.php | WordPress のログイン画面 |
/administrator/ | Joomla の管理画面 |
判定条件
| 判定 | 条件 | 得点係数 |
|---|---|---|
| × 要改善(fail) | いずれかが、(a) HTTP 200で、セットアップフォームの署名(<form id="setup" ... action="...step=..."、name="weblog_title"、「Joomla … Installation」の表記)を含む、または (b) 3xx応答(301・302・303・307・308)で Location が WordPress の setup-config.php か Joomla の installation/index.php を指す | 0 |
| △ 要確認(warn) | × に該当せず、いずれかが HTTP 200で管理入口の署名(wp-submit、user_login、com_login/com-login、mod-login-username、administrator login、インストール済み表示の「Already Installed」、WordPress 管理画面の wp-core-ui クラス)を含む | 0.45 |
| ○ 問題なし(pass) | 上記の署名が一致しない(404、403、ログイン画面へのリダイレクトのみ、別内容など) | 1 |
この項目には対象外(na)はありません。CMSを使っていないサイトでは、3パスとも署名が一致せず ○ になります。重み2のため、× は2点分、△ は1.1点分の減点です。診断結果の根拠欄には、確認したセットアップ画面または管理ログイン入口の件数が表示されます。
判定の考え方
- 未完了のセットアップ画面は、誰でも管理者を作成できる重大な状態のため × とします。
- インストール済みの「Already Installed」表示は、セットアップ機能自体は動作しないため × にはしません。不要な情報の露出として △ に含めます。
- ログイン画面は存在だけでは脆弱性を断定できないため △ とし、接続元制限・多要素認証の有無を手動で確認する前提です。
- リダイレクトは追わないため、
/wp-login.phpが別ドメインのSSOへ302する構成は ○ になります。 - 応答が180KBを超える場合は取得失敗として扱い、署名不一致(○ 側)になります。
自治体サイトでの判定例
| 状況 | 判定 |
|---|---|
| 独自CMSやSaaS型CMSで構築され、上記パスがすべて404 | ○ |
WordPress で構築され、/wp-login.php が誰でも表示できる | △ |
| 同上で、庁内IPからのみ到達できるよう制限しており、外部からは403 | ○ |
新しい特設サイトをWordPressで立ち上げる途中で、wp-config.php を置く前にDNSを公開してしまい、install.php が setup-config.php へリダイレクトする | × |
Joomla を展開しただけでインストーラーを完了しておらず、/administrator/ が installation/index.php へリダイレクトする | × |
CMSのセットアップ画面や管理入口が露出するとどんなリスクがあるか
- セットアップ乗っ取り(WPSetup攻撃):Wordfence は2017年、未設定のWordPressの
/wp-admin/setup-config.phpを自動スキャンし、攻撃者自身のデータベース情報を入力してインストールを完了させ、管理者として任意のPHPコードを実行する攻撃が増加したと報告しました。同じホスティングアカウント上の他サイトにも被害が及び得るとされています。 - 管理入口への総当たり:
/wp-login.phpや/administrator/は自動化されたパスワード総当たり・リスト型攻撃の主要な標的です。弱いパスワードや既定ユーザー名(admin など)が残っていると、サイト改ざんや不正なページ・リンクの挿入につながります。 - 改ざんの二次被害:自治体サイトが改ざんされると、偽の給付金案内やフィッシングへの誘導、マルウェア配布の踏み台にされ、住民被害と信用失墜を招きます。
- CMSの特定:管理入口やインストール画面の表示から、CMSの種類が判明し、既知脆弱性の検索に使われます。
CMSセットアップ画面・管理入口の対策方法(Apache・nginx・IIS)
1. セットアップは非公開の状態で完了させる
- 新規サイトは、DNS公開や外部公開の前に
wp-config.phpの作成とinstall.phpの完了まで済ませます。 - 作業中は Basic 認証や接続元IP制限をかけておきます。
- 完了後、運用上不要であれば
install.phpへのアクセスを拒否します。Joomla は完了後にinstallationフォルダーを必ず削除します。
Apache(WordPress の wp-admin/.htaccess など):
<Files "install.php">
Require all denied
</Files>
<Files "setup-config.php">
Require all denied
</Files>
nginx:
location = /wp-admin/install.php { return 404; }
location = /wp-admin/setup-config.php { return 404; }
2. 管理入口を接続元で制限する
Apache 2.4(.htaccess、庁内ネットワークのグローバルIPだけ許可する例):
<Files "wp-login.php">
Require ip 203.0.113.0/24
</Files>
nginx:
location = /wp-login.php {
allow 203.0.113.0/24;
deny all;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php-fpm.sock;
}
IIS(web.config、IPアドレスとドメインの制限機能が必要):
<location path="wp-login.php">
<system.webServer>
<security>
<ipSecurity allowUnlisted="false">
<add ipAddress="203.0.113.0" subnetMask="255.255.255.0" allowed="true" />
</ipSecurity>
</security>
</system.webServer>
</location>
/wp-admin/ 配下を丸ごとIP制限すると、公開側から呼ばれる admin-ajax.php が動かなくなるプラグインがあります。制限は wp-login.php から始め、admin-ajax.php を除外して段階的に広げます。
3. 認証を強化する
- 多要素認証プラグインやSSO(IdP連携)を導入する。
- 既定ユーザー名
adminを使わない。 - ログイン試行回数制限・アカウントロックを設定する。
- 退職・異動者のアカウントを速やかに無効化する。
4. 管理入口の露出の確認方法
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" https://www.example.lg.jp/wp-admin/install.php
curl -s https://www.example.lg.jp/wp-admin/install.php | grep -E 'id="setup"|weblog_title|Already Installed'
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.lg.jp/wp-login.php
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.lg.jp/administrator/
外部ネットワークから403または404になり、庁内からは従来どおりログインできれば完了です。対応後はセキュリティAIチェッカーで再診断し、判定が ○ になったことを確かめます。
サイトを壊さないための注意点(ガードレール)
- IP制限は、職員のテレワーク環境や委託先の保守回線からの接続を事前に洗い出してから適用します。締め出された場合に備え、サーバーへの直接ログイン手段を確保しておきます。
- CDN・WAF経由の構成では、Webサーバーから見える接続元がCDNのIPになるため、
Require ipが意図どおりに働きません。CDN側で制限するか、正しいクライアントIPを復元する設定(mod_remoteip 等)を先に行います。
よくある質問(FAQ)
WordPressのinstall.phpが200で表示されるのは危険ですか?
インストール完了後のinstall.phpは「Already Installed」と表示して処理を終了し、ステータスは200のままです。セットアップ機能自体は動かないため乗っ取りの危険はありませんが、WordPressの利用が分かる情報の露出なので、不要ならアクセスを拒否します。
管理画面のURLを変更すれば安全ですか?
URLの変更は自動スキャンの一部を避けるだけです。認証の強度(多要素認証・試行回数制限)と接続元の制限が本質的な対策です。
wp-login.phpが外部から表示できるのは脆弱性ですか?
存在だけでは脆弱性ではありません。ただし総当たり攻撃やリスト型攻撃の主要な標的になるため、接続元IP制限・多要素認証・ログイン試行回数制限があるかを確認する必要があります。
WPSetup攻撃とは何ですか?
Wordfenceが2017年に報告した攻撃で、未設定のWordPressの/wp-admin/setup-config.phpを自動スキャンし、攻撃者自身のデータベース情報を入力してインストールを完了させ、管理者として任意のPHPコードを実行するものです。同じホスティングアカウント上の他サイトにも被害が及び得るとされています。
/wp-admin/全体をIP制限してもよいですか?
公開側から呼ばれるadmin-ajax.phpが動かなくなるプラグインがあります。制限はwp-login.phpから始め、admin-ajax.phpを除外して段階的に広げてください。
CMSを使っていないサイトはどう判定されますか?
この項目に対象外(na)はありません。CMSを使っていない場合は3つのパスとも内容署名が一致しないため「○ 問題なし」になります。
CDN経由のサイトでRequire ipが効かないのはなぜですか?
Webサーバーから見える接続元がCDNのIPになるためです。CDN側で制限するか、mod_remoteipなどで正しいクライアントIPを復元する設定を先に行います。
この項目を含む127項目を、URLを入れるだけで無料診断します。
参考資料
- WordPress ソースコード wp-admin/install.php
- WordPress ソースコード wp-load.php
- Joomla ソースコード administrator/templates/atum/login.php
- Joomla ソースコード mod_login/tmpl/default.php
- Joomla ソースコード administrator/includes/framework.php
- Wordfence「The WPSetup Attack: New Campaign Targets Fresh WordPress Installs」
- OWASP WSTG-CONF-05 Enumerate Infrastructure and Application Admin Interfaces
- OWASP ASVS 5.0.0 V6 Authentication
- OWASP ASVS 5.0.0 V8 Authorization
- OWASP ASVS 5.0.0 V15 Secure Coding and Architecture
- WordPress Advanced Administration「Hardening WordPress」