2026年5月20日

2026年5月20日

WordPressのファイルが改ざんされた場合の復旧方法

はじめに

WordPressのファイルが改ざんされると、スパムページの表示・訪問者のリダイレクト・マイニングスクリプトの埋め込みなど様々な被害が発生します。改ざんを正確に検出し、クリーンな状態に復旧する手順を解説します。

症状・原因

  • サイトが見知らぬドメインにリダイレクトされる
  • ページの下部やヘッダーに見覚えのないスクリプトが表示される
  • wp core verify-checksums でエラーが出る
  • FTPでファイル一覧を見ると更新日時が不自然に新しいファイルがある

解決手順

ステップ1:改ざんされたファイルを特定する

# WordPress コアファイルの整合性チェック
wp core verify-checksums
# 出力例:
# Warning: File should not exist: wp-content/false.php
# Warning: File was modified: wp-login.php

# プラグインの整合性チェック
wp plugin verify-checksums --all 2>&1 | grep -v "^Success"

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

find /var/www/html -name "*.php" -mtime -7 \
    -not -path "*/cache/*" | sort

# *.js ファイルも確認(JSインジェクション)
find /var/www/html -name "*.js" -mtime -7 \
    -not -path "*/node_modules/*" \
    -not -path "*/cache/*" | sort

# 不審な内容のファイルを確認
grep -r "document.write\|unescape\|fromCharCode" \
    /var/www/html/wp-content/themes --include="*.js" -l
# Git を使っている場合:変更されたファイルを確認
cd /var/www/html
git diff --name-only HEAD

# Git がない場合:ハッシュでファイルを比較
# クリーンなWordPressのMD5チェックサムと比較
md5sum /var/www/html/wp-login.php
# WordPress公式の既知MD5と照合(バージョンに依存)

ステップ2:バックアップから復旧する(推奨)

# ① バックアップの日付を確認(改ざん前のものを選ぶ)
ls -lth /backups/*.tar.gz | head -10

# ② バックアップを展開して確認
mkdir /tmp/restore_check
tar -xzf /backups/backup_YYYYMMDD.tar.gz -C /tmp/restore_check

# ③ 改ざんファイルのみ復元(全体復元ではなく選択復元)
# wp-login.php を復元する例
cp /tmp/restore_check/var/www/html/wp-login.php \
   /var/www/html/wp-login.php

# ④ テーマファイルを復元
cp -r /tmp/restore_check/var/www/html/wp-content/themes/mytheme/ \
      /var/www/html/wp-content/themes/mytheme/

# ⑤ データベースも復元する場合
wp db import /backups/db_backup_YYYYMMDD.sql

ステップ3:コアファイルを上書きして修復する

# WordPress コアファイルを公式ソースで上書き
wp core download --force --locale=ja

# 特定のバージョンに戻す場合
wp core download --force --version=6.4.3 --locale=ja

# 上書き後に整合性を再確認
wp core verify-checksums
# .htaccess が改ざんされている場合はリセット
# ① 現在の .htaccess をバックアップ
cp /var/www/html/.htaccess /tmp/htaccess_backup_$(date +%Y%m%d).txt

# ② WordPress デフォルトの .htaccess に戻す
wp rewrite flush --hard

# ③ 不審な内容が残っていないか確認
cat /var/www/html/.htaccess
# RewriteRule で外部URLへのリダイレクトが追加されていないか確認

ステップ4:改ざんされたテーマ・プラグインを修復する

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

# カスタムテーマの場合:バックアップから復元
# functions.php はよく改ざんターゲットになる
diff /tmp/restore_check/.../functions.php \
     /var/www/html/wp-content/themes/mytheme/functions.php

# プラグインを全て再インストール
wp plugin list --format=csv --fields=name,status | \
    tail -n +2 | cut -d',' -f1 | \
    xargs -I{} wp plugin install {} --force
// functions.php の改ざん確認:先頭に不審なコードが追加されていないか
// よくある改ざんパターン:
// <?php eval(base64_decode('...'));
// <?php @include('/tmp/.systemcache');
// <?php if(isset($_POST['cmd'])){ eval($_POST['cmd']); }

// 正常な functions.php の先頭行の例:
<?php
/**
 * テーマ名 functions
 */

// 改ざん後は先頭付近に1行の難読化コードが追加されることが多い

ステップ5:再改ざんを防ぐ

# ① ファイルパーミッションを修正
find /var/www/html -type f -name "*.php" -exec chmod 644 {} \;
find /var/www/html -type d -exec chmod 755 {} \;
chmod 600 /var/www/html/wp-config.php

# ② wp-content/uploads でのPHP実行を禁止
echo '<FilesMatch "\.php$">
Order Deny,Allow
Deny from all
</FilesMatch>' > /var/www/html/wp-content/uploads/.htaccess

# ③ ファイル変更監視を設定(Wordfence)
wp plugin install wordfence --activate

# ④ 認証キーをリセット
wp config shuffle-salts

# ⑤ 定期的な整合性チェックをcronに設定
# wp core verify-checksums を毎日実行
echo "0 3 * * * www-data wp --path=/var/www/html core verify-checksums 2>&1 | grep -v '^Success' | mail -s 'WP Integrity Check' admin@example.com" >> /etc/cron.d/wp-integrity

注意事項

  • バックアップからの復旧は、改ざんのバックアップを使用してください。改ざん後のバックアップを復旧すると改ざんコードも一緒に戻ってしまいます
  • wp core verify-checksums はコアファイルのみチェックします。テーマ・カスタムプラグインは手動確認が必要です
  • 改ざんの入口となった脆弱性(古いプラグイン・弱いパスワード・不要なFTPアクセス等)を修正しないと再改ざんされます

まとめ

ファイル改ざんの復旧は①wp core verify-checksumsfind -mtime -7で改ざんファイルを特定、②改ざん前のバックアップから選択復元、③wp core download --forceでコアファイルを上書き、④.htaccesswp rewrite flush --hardでリセット、⑤パーミッション修正・Wordfence導入・shuffle-saltsで再発防止、の順で対処します。

お気軽にご相談ください

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