2026年5月20日

2026年5月20日

WordPressの管理者アカウントを乗っ取られたときの回復手順(WP-CLI・phpMyAdmin)

WordPress の管理者アカウントを乗っ取られると、パスワードやメールアドレスを変えられてログインできなくなったり、知らない管理者ユーザーや不正なファイルを追加されたりします。この記事では、サーバーに SSH かファイルマネージャー・phpMyAdmin で入れることを前提に、ログインを取り戻し、攻撃者が残した入口を閉じるまでの手順を説明します。

作業の順番は次のとおりです。ログインを取り戻すだけで終わらせず、後半の「入口を閉じる」まで進めることが大切です。パスワードを変えても、攻撃者が別の管理者ユーザーや不正なファイルを残していれば、また入られます。

  1. 今の状態を保存する
  2. サイトを一時的に閉じる
  3. ログインを取り戻す
  4. 全員のログインを無効にする
  5. 不正なユーザー・設定・ファイルを取り除く
  6. 周辺のパスワードを変える
  7. 再発防止策を入れてサイトを開ける

以下の WP-CLI のコマンドは、WordPress のフォルダー(wp-config.php がある場所)で実行します。

手順1: 今の状態を保存する

ファイルを消したり上書きしたりする前に、今の状態を丸ごと保存します。何をされたかを後で調べるときや、作業で必要なファイルを消してしまったときに使います。保存先は、Web から見えない場所(公開フォルダーの外)にします。

# データベースを書き出す
wp db export ~/incident-db.sql

# ファイルをまとめて保存する(/var/www/example は WordPress のフォルダーに置き換える)
tar czf ~/incident-files.tar.gz -C /var/www example

レンタルサーバーで SSH が使えない場合は、管理パネルのバックアップ機能や、FTP でのダウンロード、phpMyAdmin の「エクスポート」で保存します。

手順2: サイトを一時的に閉じる

調べている間に攻撃者が操作を続けたり、訪問者に不正な内容を見せたりしないよう、自分の IP アドレス以外からサイトを開けないようにします。Apache(.htaccess が使えるサーバー)では、WordPress のルートの .htaccess の先頭に次を追加します。IP アドレスは自分のものに置き換えます。

# 調査中は自分の IP アドレスからだけ開けるようにする(作業が終わったら削除する)
Require ip 203.0.113.10

WordPress の .maintenance ファイルによるメンテナンスモードは、作られてから10分たつと自動で解除される仕組みのため、長い作業の間サイトを閉じておく用途には向きません。レンタルサーバーによっては、管理パネルにサイトの公開を止める機能やアクセス制限の機能があります。

手順3: ログインを取り戻す

WP-CLI を使う場合

まず、管理者ユーザーの一覧を確認します。

wp user list --role=administrator --fields=ID,user_login,user_email,user_registered

自分のアカウントのメールアドレスが変えられていたら、先に戻します。そのうえで、新しいパスワードを作って表示させます。

# メールアドレスを自分のものに戻す(変更の通知メールは送らない)
wp user update 1 --user_email=you@example.com --skip-email

# 新しいパスワードを作って画面に表示する(メールは送らない)
wp user reset-password 1 --skip-email --show-password

1 は自分のユーザー ID に置き換えます。表示されたパスワードでログインし、ログイン後にプロフィール画面で自分のパスワードに変えます。

phpMyAdmin を使う場合

WP-CLI が使えない場合は、phpMyAdmin で SQL を実行します。テーブル名の先頭(wp_)は、wp-config.php の $table_prefix の値に合わせます。

-- ユーザー ID 1 のパスワードを一時的なものにする
UPDATE wp_users SET user_pass = MD5('ここに一時的なパスワード') WHERE ID = 1;

-- メールアドレスも戻す場合
UPDATE wp_users SET user_email = 'you@example.com' WHERE ID = 1;

WordPress は、MD5 の値が入っている場合でもそのパスワードでログインでき、ログインした時点で現在の方式で保存し直します。MD5 のまま放置しないよう、ログインしたらすぐプロフィール画面でパスワードを変えます。

手順4: 全員のログインを無効にする

攻撃者のブラウザーに残っているログイン状態を切るため、認証用のキーを作り直します。自分を含む全員がログアウトします。

wp config shuffle-salts

WP-CLI が使えない場合は、wp-config.php の AUTH_KEY から NONCE_SALT までの8行を、WordPress.org の秘密鍵サービスで作った新しい値に置き換えます。

手順5: 不正なユーザー・設定・ファイルを取り除く

知らないユーザーとアプリケーションパスワード

# 全ユーザーを登録日つきで確認する
wp user list --fields=ID,user_login,user_email,user_registered,roles

# 知らないユーザーを削除する(投稿はユーザー ID 1 に引き継ぐ)
wp user delete 5 --reassign=1

# 管理者ユーザーごとに、アプリケーションパスワードを確認する
wp user application-password list 1

# 自分で作った覚えのないものは削除する(すべて削除する場合は --all)
wp user application-password delete 1 --all

アプリケーションパスワードは、通常のパスワードとは別に REST API などへのログインに使えるものです。攻撃者が作っていると、パスワードを変えても外部から操作され続けるため、管理者全員について確認します。管理画面では、各ユーザーのプロフィール画面の「アプリケーションパスワード」欄で確認・削除できます。

書き換えられやすい設定

# ユーザー登録を受け付けるか(0 が受け付けない)
wp option get users_can_register

# 新規ユーザーの権限グループ(subscriber が標準)
wp option get default_role

# 管理者メールアドレスとサイトの URL
wp option get admin_email
wp option get siteurl
wp option get home

users_can_register が 1 で、default_role が administrator になっていると、だれでも管理者として登録できる状態です。使っていなければ wp option update users_can_register 0、wp option update default_role subscriber で戻します。

ファイルの改ざん

# WordPress 本体のファイルが公式の配布物と同じか確認する(本体のフォルダーにあるべきでないファイルも報告される)
wp core verify-checksums --include-root

# WordPress.org で配布されているプラグインのファイルを確認する
wp plugin verify-checksums --all

# 自動で読み込まれるプラグイン(mu-plugins)とドロップインを確認する
wp plugin list --status=must-use
wp plugin list --status=dropin

# アップロード用のフォルダーにある PHP ファイルを探す(通常は無い)
find wp-content/uploads -name "*.php"

# 最近14日間に変更された PHP ファイルを探す
find . -name "*.php" -mtime -14

本体のファイルに違いが見つかった場合は、同じバージョン・同じ言語の本体を上書きします。--skip-content を付けると、wp-content には触れません。次の例は日本語版の場合で、英語版なら --locale=ja を外します。

wp core download --version=$(wp core version) --locale=ja --skip-content --force

wp-config.php は配布物に含まれないため、上書きされません。中身に見覚えのないコード(eval( や base64_decode( を含む長い行など)が足されていないか、目で確認します。

プラグインやテーマに違いが見つかった場合は、WordPress.org で配布されているものなら wp plugin install プラグインのスラッグ --force で入れ直し、使っていないものは削除します。有料のプラグインやテーマは、販売元から入手し直したファイルで置き換えます。

改ざんの範囲が広い場合や、どこまで書き換えられたかわからない場合は、乗っ取られる前のバックアップから戻すほうが早いことがあります。その場合も、戻した後で手順3〜6を行います(バックアップの時点ですでに入られていた可能性があるため)。

手順6: 周辺のパスワードを変える

WordPress の管理者パスワードのほか、攻撃者が知っている可能性のあるものを変えます。

  • ほかの管理者・編集者のパスワード(wp user reset-password で、本人にメールで再設定を案内できます)
  • レンタルサーバーの管理パネル、FTP・SFTP、SSH のパスワードや鍵
  • データベースのパスワード(変えたら wp-config.php の DB_PASSWORD も合わせる)
  • 管理者メールアドレスのメールアカウント

手順7: 再発防止策を入れてサイトを開ける

# WordPress 本体・プラグイン・テーマを最新にする
wp core update
wp plugin update --all
wp theme update --all

# 二段階認証のプラグインを入れる
wp plugin install two-factor --activate

# ログインの試行回数を制限するプラグインを入れる
wp plugin install limit-login-attempts-reloaded --activate
  • 使っていないプラグインとテーマは、停止ではなく削除します。
  • wp-config.php は、所有者と Web サーバーだけが読める権限(WordPress の公式ドキュメントでは 400 または 440)にします。ただし、レンタルサーバーによっては PHP の動き方の違いで読めなくなることがあるため、サーバー会社の推奨値を確認します。
  • Google Search Console に登録している場合は、「セキュリティの問題」のレポートを確認し、警告があれば対処後に審査を依頼します。

最後に、手順2で .htaccess に追加した Require ip の行を削除し、サイトを開けます。

ログインページの守り方は、「WordPressのログインページ(wp-login.php)をIPアドレスで制限する方法」や「WordPressのログイン試行回数を制限する方法」でも説明しています。

まとめ

  • 消す前に、データベースとファイルを公開フォルダーの外に保存する
  • サイトを自分の IP アドレスからだけ開けるようにしてから作業する
  • wp user reset-password か phpMyAdmin の SQL でログインを取り戻し、wp config shuffle-salts で全員のログインを切る
  • 知らないユーザー、アプリケーションパスワード、users_can_register と default_role、mu-plugins、アップロードフォルダーの PHP ファイルを確認する
  • 本体・プラグインは公式の配布物で上書きし、サーバー・データベース・メールのパスワードも変える

お気軽にご相談ください

お見積りへ お問い合わせへ
▲