
こんにちわ、クセの強い映像制作会社「トビガスマル」代表の廣瀬です。ある朝、うちのサイトが編集マンの気分転換みたいに別世界へワープ。調べてみると、犯人は——.htaccessが勝手に戻るという怪奇現象でした。
index.phpが何度でも転生し、サーバーの外側には「.htaccess/wp-blog-header.php(3KB)/wp-cron.php(3KB)」の三点セットが潜伏。極めつけは管理者欄に紛れ込んだAl1wpadmin(エルとイチの見分けクイズ)。映画なら笑えるけど、現実は笑えない。
そこで我々は、wp-admin/wp-includesを丸ごと入替→uploadsでPHP実行禁止→鍵(SALT)総入替の三段カットで反撃。この記事では「なぜ飛ぶのか」「どう止めるか」「二度と撮り直し(再感染)しないために」を、実録ベースでテンポよく解説します。準備よろしい?本番、よーい——セキュリティ!
目次
- 1 こうして事件は始まった:症状チェック(リダイレクト/ログイン不可)
- 2 改ざんのサイン:.htaccess・index.php・偽ファイルの見分け方
- 3 犯人は“三点セット”|外側に潜む .htaccess/wp-blog-header.php/wp-cron.php
- 4 wp-adminの地下室で見つけたウェブシェルと偽管理者(Al1wpadmin)
- 5 復旧の全手順:最短でサイトを戻すチェックリスト
- 6 バックアップ復元のコツ:Web+DB+外側フォルダを同日に戻す
- 7 再発防止の実践:uploadsでPHP禁止/鍵の総入替/Xserver設定
- 8 入口はどこだった?ログ解析で分かったこと(アクセスログの読み方)
- 9 よくある質問(FAQ):巻き戻り・復元時間・費用・プラグイン
- 10 まとめ:今日からできる3つの予防策
こうして事件は始まった:症状チェック(リダイレクト/ログイン不可)
まず疑うべきサイン(“それ、改ざんかも”リスト)
- トップや特定ページを開くと、見知らぬ外部サイトへ自動リダイレクトされる(時々・毎回・端末によって違う)。
/wp-login.php
が真っ白/404/別サイトに飛ぶ(管理画面に入れない)。.htaccess
を直しても数十秒で元に戻る(いわゆる“巻き戻り”)。index.php
が異常に大きい、もしくは勝手に再生成される。- サイトのどこかで英語の“安全ではありません”“your site is hacked”的な文言や怪広告が出る。
一次切り分け(3分でできる“犯人は誰だ”テスト)
- シークレットウィンドウ+別回線で確認(スマホの4G/5Gや別Wi-Fi)。ブラウザ拡張やキャッシュ要因を除外。
- URL直叩きで挙動を比較:
/
(トップ)//wp-login.php
//robots.txt
//sitemap.xml
→ ログインだけ飛ぶ?全部飛ぶ?で“.htaccess改ざん”か“アプリ側”かの見当がつきます。 - 更新日時で犯行時刻をあぶり出す:ファイルマネージャで並べ替え → 同じ時刻で一斉に変わっているフォルダをメモ。
- 外側フォルダ(
/mail
、/xserver_php
、アカウント直下など)に
.htaccess
/wp-blog-header.php(約3KB)
/wp-cron.php(約3KB)
の“三点セット”がいないかチェック。 - Google Search Console があれば「セキュリティの問題」を確認(警告が出ることがあります)。
“現場保存”のために今すぐやること
- スクショ:リダイレクト先URL、エラーメッセージ、更新日時一覧を撮っておく。
- バックアップ確保:
/public_html
をZIPでDL、DBをエクスポート(のちの比較に必須)。 - アクセス制限で封鎖(一時):ベーシック認証を
/public_html
に設定 or 一時的に.htaccess
をRequire all denied
に。
やりがちなNG(被害拡大スイッチ)
- プラグイン大量インストールで“なんとなく”直そうとする(原因が増殖します)。
- .htaccessを何度も上書きだけして終了(書き戻しの発信源が外側に残ると無限ループ)。
- 管理者パスワードを後回し(復旧中にまた入られることがあります)。
プロっぽい確認メモ(必要なら)
- サイズで違和感:正しい
index.php
は数百バイト程度。巨大化していたら要注意。 - .htaccessの怪文書:
<FilesMatch>
でphp/phtml/exe/suspected
を許可していたら改ざんパターン。 - ログイン不可の切り分け:
/wp-login.php
だけNG=WAF/リダイレクト細工の可能性、全ページNG=.htaccess or ルート改ざんの可能性高。
改ざんのサイン:.htaccess・index.php・偽ファイルの見分け方
危険な .htaccess の例(見たら即アウト)
<FilesMatch>
でphp
/phtml
/exe
/suspected
など本来ブロックすべき拡張子を許可している。- 存在しないはずのファイル名をピンポイントで Allow(例:
wp-confiq.php
、wp-crom.php
など“q”“m”の置換)。 - やたら長い正規表現や大文字小文字混在の拡張子列(例:
Php|PHp|pHp…
)。 - 権限が 444/555 固定で編集できない(ロックして書き戻しに使う典型)。
正常な .htaccess(WordPress 既定)は下記だけです:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
index.php の判定(サイズと中身で即わかる)
- 正常:数百バイト。中身はほぼこれだけ。
<?php define('WP_USE_THEMES', true); require __DIR__ . '/wp-blog-header.php';
- 改ざん:数KB〜数百KB以上に巨大化/意味不明な難読(
base64_decode
・eval
・gzinflate
など)が並ぶ/勝手に再生成される。
“偽ファイル”の典型と居場所
wp-blog-header.php
(約3KB)・wp-cron.php
(約3KB)がpublic_html の外側(例:/mail/
、/xserver_php/
、アカウント直下)に出現。wp-admin
配下のランダム名の大型PHP(1MB前後)+同階層の.htaccess(555)
。- テーマの
functions.php
末尾にユーザー自動作成やリモート実行っぽいコード(wp_insert_user
、eval
等)。
チェックの進め方(3分クイック点検)
- ルート(
/public_html
)の.htaccess
を開き、上の「正常版」と一致するか確認。 - ルートの
index.php
のサイズと先頭数行を確認(巨大・難読ならアウト)。 - 外側フォルダ(
/mail/
、/xserver_php/
、アカウント直下 など)で
「.htaccess
/wp-blog-header.php
/wp-cron.php
」の三点セットを検索。 wp-admin/
直下〜下層に不審な大きいPHPと.htaccess
が無いかを一覧ソートで確認。
見つけたらどうする?(ミニ初動)
- 権限を 644 に変更してから不審ファイルを削除(444/555 のままでは消せない)。
- ルートの
.htaccess
は正常版に戻し、様子見後に444でロック。 - 併せて
wp-admin
/wp-includes
は公式パッケージで丸ごと入替を前提に。
犯人は“三点セット”|外側に潜む .htaccess/wp-blog-header.php/wp-cron.php
三点セットとは?(正体と役割)
改ざん時にpublic_htmlの外側へばら撒かれる、下記の不審ファイル三兄弟です。
.htaccess
… 実行許可やリダイレクトを仕込み、復旧を巻き戻す司令塔。wp-blog-header.php
(約3KB) … 本物を装った偽ファイル。外側から読み込ませる踏み台。wp-cron.php
(約3KB) … タイマー役。一定間隔で巻き戻し処理を起動。
この3つが外側に生きていると、ルートの .htaccess
や index.php
を直しても数十秒〜数分で再汚染されます。
どこに潜む?(よくある隠れ家)
- アカウント直下(例:
/xs123456.xsrv.jp/
の直下) /mail/
配下(Maildir
、Maildir.1
など各ユーザー箱)/xserver_php/
、/xserver_php/session/
、/autoreply/
/log/
、/htpasswd/
、/script/
など管理系フォルダ
目印:更新日時が同一(例:19:01〜19:03に集中)、サイズが約3KB、.htaccess
の権限が 444/555 固定。
なぜ巻き戻るのか(仕組みの超要約)
- 外側の
.htaccess
が許可ルールを設定(危険拡張子の実行許可)。 wp-cron.php
が偽物のwp-blog-header.php
を通じて定期実行。- ルートの
.htaccess
とindex.php
を上書き再生成 → 復旧が無効化。
安全な除去手順(順番厳守)
- フォルダ単位で巡回:上の「隠れ家」を一つずつ開く。
- 権限解除:各ファイルのパーミッションを 444/555 → 644 に。
- 削除:
.htaccess
/wp-blog-header.php
/wp-cron.php
をすべて削除。消せなければ.bad
へリネーム。 - ルート整備:
/public_html/.htaccess
を正常版へ戻し、様子見の後に 444 でロック。
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
- 観察:30〜60秒待って、
.htaccess
の自動改変が止まったことを確認。
消せない時の対処(最終手段)
- フォルダ隔離:親フォルダごと
*.bad
にリネーム → 新規フォルダをアップ。 - 復元の粒度を落とす:自動バックアップの「対象を指定して復元」で該当フォルダのみ感染前日に戻す。
- サポートに権限リセット依頼:所有者/権限不整合で削除不可な場合は運営に解除依頼。
削除後にやる最小セット(再発防止)
wp-admin/wp-includes
を公式パッケージで丸ごと入替wp-content/uploads/.htaccess
を作成しPHP実行禁止- 管理者パスワード総入替+
wp-config.php
の AUTH_KEY/SALT 再生成
wp-adminの地下室で見つけたウェブシェルと偽管理者(Al1wpadmin)
ウェブシェルの特徴(ここを見れば怪しい)
- ファイル名がランダム(例:
WtXAhWdV.php
のような大文字小文字混在)。 - サイズが異常(1MB前後など巨大。通常のWP管理系PHPは数KB〜数十KB)。
- 同階層に
.htaccess(555/444)
が置かれ編集不可になっている。 - 中身に
base64_decode
/eval
/gzinflate
/str_rot13
などの「難読化関数」が並ぶ。
安全な駆除手順(wp-admin 配下)
- 隔離:
/wp-admin
をwp-admin.bad
にリネーム(フォルダごと隔離)。 - 正規品で置換:WordPress公式パッケージから新しい
wp-admin/
を丸ごとアップ。 - 関連ロック解除:隔離先(
wp-admin.bad
)内の怪しい.php
と.htaccess
は 555→644 にしてから削除。 - コア補強:同時に
wp-includes/
も公式で丸ごと入替、ルートのindex.php / wp-blog-header.php / wp-cron.php / wp-load.php / wp-settings.php
を上書き。
偽管理者「Al1wpadmin」の見抜き方と削除
- 見抜き方:
Al1wpadmin
(エルとイチ混在)/見覚えのない管理者メール(例:al1wpadmin@gmail.com
)。 - UIでの削除手順:ユーザー一覧→該当ユーザーを購読者に変更→更新→削除(投稿は正規管理者に譲渡)。
- SQLでの削除(消えない場合):phpMyAdmin でIDを確認→
wp_usermeta
→wp_users
の順に削除。
“鍵の総入替”で後始末
- 全管理者のパスワード変更(強力なランダムへ)。
- SALT再生成:
wp-config.php
の AUTH_KEY/SALT 8行を新規値で置換→全セッション強制ログアウト。 - アプリケーションパスワード(ユーザープロフィール最下部)を全消去。
- 管理用メール(設定→一般)が攻撃者アドレスに変わっていないか確認。
発見を早めるコツ(運用の型)
- 更新日時ソートで
wp-admin/
とwp-includes/
を定期巡回(同時刻に一斉更新は要注意)。 - テーマの
functions.php
やmu-plugins
にユーザー作成コード(wp_insert_user
等)がないか検索。 - ログイン試行回数制限・ベーシック認証を /wp-login.php / /wp-admin に導入(Xサーバーのアクセス制限で可)。
復旧の全手順:最短でサイトを戻すチェックリスト
A. 初動(5分で封じ込め)
- アクセス遮断:一時的に
/public_html/.htaccess
を以下で保存(復旧後に戻す)。
Require all denied
- Cron停止:サーバーパネルの Cron を一旦「無効」に。
- バックアップ確保:現状の
/public_html
と DB をエクスポート(比較用)。
B. “発信源”の除去(外側フォルダの三点セット)
- 以下の場所を一つずつ開き、
.htaccess
/wp-blog-header.php(約3KB)
/wp-cron.php(約3KB)
を発見次第、権限 444/555 → 644 に変更して削除。
- アカウント直下(例:
/xsXXXXXX.xsrv.jp/
) /mail/**
(Maildir
,Maildir.1
など各ユーザー箱)/xserver_php/
,/xserver_php/session/
,/autoreply/
/log/
,/htpasswd/
,/script/
等
- アカウント直下(例:
- 削除できなければ ファイル名を
*.bad
にリネーム → サポートへ「所有者/権限リセット」依頼。
C. コアの“正規入替”(手動で盤石に)
- wp-admin 交換:既存
/wp-admin
をwp-admin.bad
にリネーム → 公式パッケージのwp-admin/
を丸ごとアップ。 - wp-includes 交換:同様に公式の
wp-includes/
を丸ごとアップ。 - ルートのコア上書き:
wp-blog-header.php
/wp-cron.php
/wp-load.php
/wp-settings.php
を上書き。 - index.php 再作成(数百Bが正解):
<?php define('WP_USE_THEMES', true); require __DIR__ . '/wp-blog-header.php';
- 権限の目安:ディレクトリ 755 / ファイル 644
D. .htaccess 整備(短く・堅く)
- ルート:下記だけにして保存 → 様子見して問題なければ 444 に固定。
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
- uploads 実行禁止:
/wp-content/uploads/.htaccess
を新規作成(444)。
<FilesMatch "\.(?:php|phtml|php5|php7|php8|phps|pht|shtml|cgi|pl|py|exe|suspected)$"> Require all denied </FilesMatch>
E. ログイン後の“鍵の総入替”
- 全管理者のパスワード変更(強力なランダム)。
- SALT再生成:
wp-config.php
の AUTH_KEY/SALT 8行を新しい値に置換(全セッション強制ログアウト)。 - 見知らぬ管理者削除(例:
Al1wpadmin
)。アプリケーションパスワードがあれば全削除。
F. 仕上げ(更新・再発防止)
- WP本体/テーマ/必要プラグインを最新に。不要は削除。
- WordPressセキュリティ設定(Xサーバー):ログイン試行制限ON/XML-RPC制限ON(未使用なら)。
- /wp-login.php・/wp-admin にベーシック認証(アクセス制限機能で追加)。
- 1週間はときどき更新日時ソートで「外側フォルダ」を巡回し、再出現がないか確認。
G. 合格サイン(ここまで来たらOK)
/public_html/.htaccess
が勝手に改変されない。- ルートの
index.php
が勝手に肥大化・再生成しない。 - トップページと
/wp-login.php
が正常表示。
バックアップ復元のコツ:Web+DB+外側フォルダを同日に戻す
なぜ「同日」復元が重要?
- 整合性の確保:ファイルとDBのズレ(URLやリダイレクト設定)が原因の不具合を防ぐ。
- 書き戻しの遮断:外側フォルダ(
/mail
・/xserver_php
等)に潜む不正ファイルも同日に戻し、再汚染を止める。 - 原因追跡の明瞭化:同じスナップショットに戻すと、ログとの突合が楽になる。
Xserverでの基本手順(対象を指定して復元)
- Web領域(/public_html)を改ざん前日付に復元。
- 同画面または続けて、外側フォルダも同日に復元:
/mail
//xserver_php
//xserver_php/session
//autoreply
/(あれば)/log
・/htpasswd
・アカウント直下 など。 - MySQLデータベースを同じ日付で復元(別タブ)。
ポイント:「すべてを復元」はメールまで巻き戻すため、通常は“対象を指定”で必要箇所だけ戻す方が安全。
復元が重い/止まる時のコツ
- 粒度を落とす:
/public_html/wp-admin
→/wp-includes
→ 残り、と順に小さく復元。 - 空き容量の確保:
/wp-content/cache
などを手動削除してから再実行。 - 同時実行しない:復元ジョブの多重実行はキュー渋滞の元。履歴タブで状態を確認。
復元“後”の必須仕上げ(再汚染防止)
- WordPressコアを公式で上書き:
wp-admin/
とwp-includes/
を丸ごと入替。ルートのindex.php
ほかコアPHPも上書き。 - .htaccess整備:ルートは正常版にして
444
固定、wp-content/uploads/.htaccess
でPHP実行禁止。 - 鍵の総入替:全管理者のPW変更+
wp-config.php
の AUTH_KEY/SALT を再生成。
差分データの取り扱い(注意点)
- 復元日以降の投稿・問い合わせ・受注は消える可能性。必要ならバックアップ前にエクスポート、復元後に再投入。
- 会員サイトの場合は、新規ユーザーや更新分の差分を確認して追補。
合格チェック(復元が効いているサイン)
- 30〜60秒待っても
/public_html/.htaccess
が勝手に改変されない。 - ルートの
index.php
が勝手に再生成・肥大化しない。 - トップと
/wp-login.php
が正常表示。
再発防止の実践:uploadsでPHP禁止/鍵の総入替/Xserver設定
1) アップロード領域で「PHP実行禁止」
/wp-content/uploads/
はユーザーが書き込めるため、ここを守るだけで被害の大半を未然に防げます。
/wp-content/uploads/.htaccess
を新規作成し、下記を保存(権限444)。
<FilesMatch "\.(?:php|phtml|php5|php7|php8|phps|pht|shtml|cgi|pl|py|exe|suspected)$"> Require all denied </FilesMatch>
- 同様に、フォーム系プラグインの保存先(例:
/wp-content/uploads/forminator/
等)にも配置推奨。
2) “鍵の総入替”でセッション一掃
- 全管理者のパスワード変更(長いランダム/使い回し厳禁)。
- SALT再生成:
wp-config.php
の AUTH_KEY/SALT 8行を新しい値で置換(全ユーザー強制ログアウト)。 - アプリケーションパスワード(ユーザープロフィール最下部)を全削除。
- 見知らぬ管理者の掃除(例:
Al1wpadmin
)と、管理用メールの差し替え有無を確認。
3) Xserver側の防御設定(推奨値)
- WordPressセキュリティ設定:ログイン試行回数制限ON/XML-RPC制限ON(未使用なら)。
- ベーシック認証:
/wp-login.php
と/wp-admin
に追加(アクセス制限機能)。 - WAF(Webアプリ防火壁):必ず有効化。誤検知が出るプラグインは個別ルールで許可。
- 自動バックアップの確認:取得サイクルと復元手順を社内で共有。
4) プラグイン/テーマの“衛生管理”
- 不要は削除(停止のまま放置しない)。
- 更新を習慣化:週1回はダッシュボードで更新確認。
- セキュリティ系は1製品に統一(WAFの二重掛けは競合の元)。
5) ログと監視のミニ運用
- 更新日時ソートで「外側フォルダ」(
/mail
・/xserver_php
等)を週1巡回。 - アクセスログを月1で保存(改ざん時刻の特定に必須)。
- Search Console のセキュリティの問題を有効化し、通知を受け取る。
6) 仕上げチェック(通過点)
/public_html/.htaccess
が勝手に改変されない(権限444のまま)。index.php
が肥大化・再生成しない。- 管理画面とフロントが安定表示し、エラーログに不審なPHP実行が出ない。
入口はどこだった?ログ解析で分かったこと(アクセスログの読み方)
何を見る?(改ざん直前1時間をズーム)
- 時間帯:発生推定の前後60分(例:18:30〜19:30)。
- 動詞:改ざんはたいてい
POST
で始まる。POST
の宛先と繰り返し回数を注視。 - 相手:同じIP/国からの連続アクセス(秒間〜分間で何十発)。怪しいUA(空/古いbot名)も手掛かり。
狙われやすいエンドポイント(痕跡の型)
/wp-login.php
… 短時間の連続POST
(総当たり)→ 成功後に管理画面系へ遷移。/wp-admin/admin-ajax.php
… 脆弱なプラグイン経由のPOST
。アップロードやオプション改変の入口になりやすい。/xmlrpc.php
…system.multicall
の大量連投(パスワード類推)。/wp-content/uploads/…
… 画像拡張子に偽装したPOST
/PUT
→ 直後のGET … .php
実行で“シェル投下→起動”。
ログの読み方(パターン別の見どころ)
- 同一IPの連続POST:秒間〜分間で数十回。成功後に
/wp-admin/
内の色々へGET
が伸びる。 - アップロード→実行:
POST /wp-admin/admin-ajax.php
(またはフォーム系エンドポイント)直後に、GET /wp-content/uploads/xxx.php
など実行痕。 - 巻き戻しのトリガ:一定間隔(1〜5分)で
GET /wp-cron.php
(偽)や外側パスの.php
にアクセス。
Xserverでの実務(生ログを狙い撃ち)
- サーバーパネル → アクセスログ → 対象ドメイン → 生ログ をダウンロード。
- PC上でテキスト検索(エディタでOK):「
POST
」「admin-ajax.php
」「xmlrpc.php
」「wp-login.php
」「/uploads/
」「wp-cron.php
」。 - 怪しいIPを見つけたら、そのIPで再検索し時系列を追う(最初の一手→投下→実行→巻き戻し)。
“犯人IP”の扱い(その後に活かす)
- .htaccessでブロック(一例/必要に応じて国やASNでの網羅も検討)
<RequireAll> Require all granted Require not ip 203.0.113.10 Require not ip 198.51.100.0/24 </RequireAll>
- WAFのカスタムルールやセキュリティプラグインの拒否リストにも同IPを登録。
改ざんの断面を“確定”させるチェック
- 最初の異常(初回
POST
)の時刻とIPを特定。 - 投下の痕(
/uploads/
や/wp-admin/
下にファイルを置く挙動)が続くか。 - 起動(置いた直後にそのファイルへ
GET … .php
)。 - 恒久化(外側の三点セットや偽
wp-cron.php
の周期アクセス)。
ログが欠けている/判別が難しい時
- 復元前の生ログが無いと入口断定は難しい。取れる範囲で時系列とIPだけでも記録。
- FTP/コンパネのログが取得できれば、外側フォルダへの直接配置の有無が分かる。
- 不審プラグインのバージョン履歴と既知脆弱性を照合(古いアップロード系・フォーム系は要注意)。
結論の出し方(クライアント説明用の型)
「時刻(例:19:01)に IP A から POST /admin-ajax.php が集中→直後に /uploads/abc.php へ GET(実行)→以降、アカウント直下の偽 wp-cron.php
に周期アクセス——この流れから、プラグイン経由のファイル投下→恒久化が主因と判断。対策はプラグイン更新・uploads実行禁止・管理系強化で再発を遮断。」
よくある質問(FAQ):巻き戻り・復元時間・費用・プラグイン
Q. .htaccess
がすぐ巻き戻るのはなぜ?
原因はpublic_htmlの外側に仕込まれた三点セット(.htaccess
/wp-blog-header.php
/wp-cron.php
)が定期的に書き戻しているためです。外側から権限を644に→削除、その後にルートの.htaccess
を正常版+444で固定すると止まります。
Q. バックアップ復元だけで直る?
Web領域+DB+外側フォルダを同じ日付に戻せば基本は直ります。ただし復元“後”の穴塞ぎ(wp-admin/wp-includes
を公式で入替、uploads
でPHP禁止、パスワード&SALT総入替)が必須。ここを省くと再発率が高いです。
Q. 復元にどのくらい時間がかかる?
データ量・空き容量・同時実行状況で変動します。/wp-content/uploads
が大きいと長引きます。進まない場合は、粒度を落として「/wp-admin
→ /wp-includes
→ 残り」の順で復元し、同時に手動のコア入替を進めるのが実務的です。
Q. いきなり消して大丈夫?証拠は必要?
駆除前にスクショとバックアップ(現状の/public_html
とDB)を取得してください。証拠保全後は、三点セットやウェブシェルは即削除でOKです。
Q. 費用の目安は?
ケース次第ですが、復旧+基本対策でおおむね6.5〜9.5万円、原因分析レポート込みで9.5〜15.5万円が目安です。自社対応できる工程が多いほど圧縮可能です。
Q. セキュリティプラグインは何を使えば?
乗っ取り後はまず一度アンインストールし、.user.ini
のauto_prepend_file
やルートのmalcare-waf.php
等の残存フックを除去。そのうえで1製品に絞って再導入(二重WAFは非推奨)。
Q. もう入られないために最低限やることは?
- uploadsでPHP禁止(
/wp-content/uploads/.htaccess
) - wp-admin / wp-includesを公式で入替+コアPHPを上書き
- 管理者PW変更&SALT再生成、不要プラグイン削除&更新
- /wp-login.php と /wp-admin にベーシック認証、XML-RPC制限(未使用なら)
まとめ:今日からできる3つの予防策
1) 「書ける場所」を守る:uploadsでPHPを永久に禁止
/wp-content/uploads/.htaccess
を配置してPHP実行をブロック(権限444)。- フォーム系プラグインの保存先にも同様のルールをコピー。
- 週1回は更新日時ソートでuploads配下にPHPがいないか点検。
2) “鍵”を回す習慣:パスワード&SALTを定期更新
- 管理者パスワードは長いランダム+使い回し厳禁、半年に一度は更新。
wp-config.php
の AUTH_KEY / SALT を再生成(全セッション強制ログアウト)。- 見知らぬ管理者/アプリケーションパスワードがないか月例点検。
3) 入口を狭める:Xserverの防御+基本運用
- WordPressセキュリティ設定:ログイン試行回数制限ON/XML-RPC制限ON(未使用なら)。
- ベーシック認証を
/wp-login.php
と/wp-admin
に追加。 - プラグイン/テーマは不要を削除・残りは常に最新に。WAFは一製品に統一。
- アクセスログは月1で保存(改ざん時刻の特定と原因追跡に必須)。
最後に:復旧は“短く正しく”
- .htaccessは短い正規版+444、index.phpは数百Bの正しい中身。
- 巻き戻りを見たらまず外側(三点セット)を削除、次にwp-admin/wp-includesの正規入替。
- 復元後は鍵の総入替とuploads実行禁止で二度目の撮り直しを防止。
ここまでやれば、次に同じ“事件”が起きても早期検知→短時間復旧が可能です。この記事が、あなたのサイトの“守りの台本”になりますように。🎬

2025.06.22
本記事では、学割付きパッケージを提供する代表的な 3 校 アドバンスクールオンライン・たのまな・デジハリ ONLINE を 価格・講座内容・サポート体制の3視点で徹底比較。 「買うならどこが自分に合う?」「動画講座の質は?」「質問サポートの違いは?」 ──そんな疑問を、早見表...

こんにちわ、クセノツヨイ映像制作会社「トビガスマル」代表の廣瀬です。 このたびご縁がありまして、国際ロープレスキューの普及と発展を担う『GRIMP JAPAN』の公式ウェブサイト制作をお手伝いさせていただきました。 「ロープレスキュー?聞いたことはあるけど、実際どんな活動なの?」という方...
コメント