2026年5月20日

2026年5月20日

WordPressのハッキングが発覚した場合の対処方法

はじめに

WordPressがハッキングされた場合、初動対応のスピードと正確さが被害の拡大を防ぐ鍵です。パニックにならず、この手順に従って体系的に対処することで、サイトを安全な状態に復旧できます。

症状・原因

  • サイトにスパムコンテンツや見知らぬリンクが表示されている
  • Googleから「このサイトは危険です」の警告が出ている
  • ホスティング会社からマルウェア検出の通知が届いた
  • 管理画面にログインできなくなった
  • サイトが突然リダイレクトされるようになった

解決手順

ステップ1:初動対応(発覚直後)

# ① すぐにメンテナンスモードにする
wp maintenance-mode activate

# ② バックアップが存在するか確認
ls -la /backups/*.sql.gz 2>/dev/null | tail -5
ls -la /backups/*.tar.gz 2>/dev/null | tail -5

# ③ 現在のWordPressファイルをバックアップ(証拠保全)
tar -czf /tmp/hacked_backup_$(date +%Y%m%d_%H%M%S).tar.gz \
    /var/www/html/wp-content/

# ④ アクセスログを保全
cp /var/log/apache2/access.log /tmp/access_log_backup.txt
cp /var/log/apache2/error.log  /tmp/error_log_backup.txt

# ⑤ ホスティング会社に報告
# 多くの場合、ホスティング会社がスキャンツールを提供している
【ハッキング確認チェックリスト】
□ Googleセーフブラウジングで確認:
  https://transparencyreport.google.com/safe-browsing/search
□ Sucuri SiteCheck でスキャン:
  https://sitecheck.sucuri.net/
□ Search Console → セキュリティと手動による対策 → セキュリティの問題
□ 最近変更されたファイルを確認(下記コマンド)

ステップ2:被害範囲を特定する

# 最近(7日以内に)変更されたPHPファイルを検索
find /var/www/html -name "*.php" -mtime -7 \
    -not -path "*/cache/*" | sort

# 不審なコードパターンを検索
grep -r "eval(base64_decode" /var/www/html --include="*.php" -l
grep -r "base64_decode(gzinflate" /var/www/html --include="*.php" -l
grep -r "\$_POST\[.*\].*eval" /var/www/html --include="*.php" -l
grep -r "preg_replace.*\/e" /var/www/html --include="*.php" -l
grep -r "system\|exec\|passthru\|shell_exec" /var/www/html/wp-content/uploads --include="*.php" -l

# uploads ディレクトリ内の PHP ファイル(本来は存在しないはず)
find /var/www/html/wp-content/uploads -name "*.php" | head -20

# アクセスログから攻撃元IPを特定
grep "POST" /var/log/apache2/access.log | \
    grep -v "wp-cron\|wp-login\|admin-ajax" | \
    awk '{print $1}' | sort | uniq -c | sort -rn | head -20

# WordPress のコア整合性チェック
wp core verify-checksums

ステップ3:全パスワードをリセットする

# ① WordPress 認証キー・ソルトをリセット
wp config shuffle-salts
# → 全ユーザーのセッションが無効化される

# ② 全管理者のパスワードをリセット
wp user list --role=administrator --fields=ID,user_login | \
    tail -n +2 | while read id login; do
    new_pass=$(openssl rand -base64 20)
    wp user update $id --user_pass="$new_pass"
    echo "Reset: $login → $new_pass"
done

# ③ データベースパスワードを変更
# MySQLで実行:
# ALTER USER 'wp_user'@'localhost' IDENTIFIED BY '新しいパスワード';
# wp-config.php の DB_PASSWORD も同時に更新

# ④ FTP/SSH パスワードをホスティング管理画面から変更

# ⑤ すべてのアクティブセッションを削除
wp session destroy --all 2>/dev/null || \
    wp eval "
global \$wpdb;
\$wpdb->query(\"DELETE FROM {\$wpdb->usermeta} WHERE meta_key = 'session_tokens'\");
echo 'All sessions destroyed' . PHP_EOL;
"

ステップ4:マルウェアを除去する

# WordPress コアファイルを再インストール
wp core download --force
wp core update --force

# プラグインを再インストール(疑わしいものは削除)
wp plugin list --format=ids | \
    xargs wp plugin install --force

# テーマを再インストール
wp theme install twentytwentyfour --force

# 感染ファイルを削除
# ※ 必ず内容を確認してから削除する
find /var/www/html -name "*.php" -mtime -7 \
    -not -path "*/cache/*" -exec grep -l "eval(base64" {} \; | \
    xargs -I{} sh -c 'echo "Removing: {}"; rm {}'

# wp-content/uploads 内のPHPファイルを削除
find /var/www/html/wp-content/uploads -name "*.php" -exec rm {} \;

# uploads ディレクトリのPHP実行を禁止(.htaccess)
echo '<FilesMatch "\.php$">
Order Deny,Allow
Deny from all
</FilesMatch>' > /var/www/html/wp-content/uploads/.htaccess
// functions.php: アップロードファイルの PHP 実行を PHP レベルで禁止
add_filter('upload_mimes', function(array $mimes): array {
    // PHPファイルのアップロードを禁止
    unset($mimes['php'], $mimes['php3'], $mimes['php4'], $mimes['php5'], $mimes['phtml'], $mimes['phar']);
    return $mimes;
});

ステップ5:再発防止策を実施する

# ① 脆弱なプラグイン・テーマを更新または削除
wp plugin update --all
wp theme update --all

# ② WordPress コアを最新に更新
wp core update

# ③ 攻撃元 IP を .htaccess でブロック
# 手順2で特定した攻撃元 IP を追記
echo "Deny from 192.168.1.1" >> /var/www/html/.htaccess

# ④ ログイン試行制限を設定
# Wordfence または Limit Login Attempts プラグインをインストール
wp plugin install wordfence --activate

# ⑤ Google Search Console に再審査を申請
# Search Console → セキュリティの問題 → 問題を修正した → 審査をリクエスト

# ⑥ メンテナンスモードを解除
wp maintenance-mode deactivate

注意事項

  • バックアップからの復旧は「ハッキング前のバックアップ」を使用してください。ハッキング後のバックアップを復旧すると、マルウェアも一緒に復旧します
  • Googleのセーフブラウジング警告は、問題修正後に再審査を申請してから解除されるまで数日かかります。申請を忘れずに行ってください
  • ハッキングの根本原因(脆弱なプラグイン・弱いパスワード・古いWordPress等)を特定して修正しないと、再発する可能性があります

まとめ

ハッキング発覚時はまずメンテナンスモードに切り替えて証拠保全します。grep -r "eval(base64_decode"で不審コードを検索、findコマンドで最近変更されたファイルを特定します。wp config shuffle-saltsで認証キーを更新して全セッションを無効化し、全パスワードをリセットします。コアファイルをwp core download --forceで再インストールし、マルウェアファイルを除去します。最後にSearch Consoleで再審査を申請してGoogleの警告を解除します。

お気軽にご相談ください

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