「マルウェアに感染したので、とりあえず全部消しました」
「バックアップはあるはずなのに、戻しても動きません」
このような状態からの復旧相談は、決して珍しくありません。
感染そのものより厄介なのは、慌てて行った対処が事態を悪化させてしまうことです。
消してしまったファイル、動かないバックアップ、誰も中身を把握していない古いシステム。
三重苦のような状態からでも、原因を順番に切り分ければサイトを戻せる可能性はあります。
WordPressの復旧を多数手がけてきたよこやま良平です。わたしの現場経験をもとに、感染後の復旧がどう進むのかを実例に沿って解説します。
- マルウェア感染後に全削除してしまった場合の復旧の流れ
- バックアップがあるのに戻らない原因
- 古いシステムがサーバー移行で動かなくなる仕組み
- WordPressとMovable Typeを切り分けて復旧した実例
- 復旧後に必ず行うべきセキュリティ対応
この記事では、実際にお受けした案件を最初から最後まで追いかけます。
一つの原因を潰すたびに次の壁が現れる、復旧作業のリアルな進み方を見ていきましょう。
マルウェア感染で全削除されたサイト復旧の発端
今回の発端は、古いPHP環境で動いていたWordPressサイトのマルウェア感染でした。
問題は感染そのものだけでなく、感染後に担当者の方が一通りファイルを削除してしまったことです。
PHP5.6環境のWordPressが感染していた
ご相談時、対象サイトはPHP5.6という古い実行環境で動いていました。
サポートが終了したPHPや古いWordPressを使い続けると、既知の弱点を突かれやすくなります。
古い環境で感染が起きること自体は、復旧現場ではよくある話です。
ただし、感染に気づいた直後の対応を誤ると、復旧の難易度は一気に上がります。
感染ファイルも正常ファイルもまとめて削除されていた
ご相談をいただいた時点で、感染したファイルを含めて一通り削除された後でした。
感染したと聞けば、まず消したくなる気持ちはよく分かります。
しかし、感染調査では「何が残っているか」と同じくらい、
「どこがどう改ざんされていたか」という痕跡が重要です。
- 感染ファイルと正常ファイルの区別がつかなくなる
- 改ざん箇所や侵入経路の痕跡が消える
- 再発防止策を立てる材料が減る
- 動作に必要なファイルまで巻き添えで消える

バックアップがあるのに戻らなかった
「バックアップはある」というお話でしたが、提供されたデータを戻してもサイトは動きませんでした。
ここで大切なのは、バックアップは取得時の環境とセットで初めて意味を持つという点です。
取得時と復元先でPHPのバージョン、データベース、サーバー設定、文字コードが違えば、
ファイルが残っていても正常に動作しないことがあります。
マルウェア感染サイトをPHP8.3環境で復旧する条件
今回の復旧条件は、古いPHP5.6環境へ戻さず、PHP8.3環境で動かすことでした。
安全性を考えると当然の判断ですが、古いプログラムほど新しい環境ではそのまま動きません。
元のPHP5.6へ戻すのは安全ではない
一番簡単に見える方法は、元のPHP5.6へ戻すことです。
しかし、それでは感染した時と同じ危険な状態へ戻すことになります。
サポートが終わった環境では、新たな弱点が見つかっても修正版が提供されません。
復旧できたように見えても、同じ事故がまた起こる可能性が残ります。
PHP8.3では古い書き方が動かないことがある
一方で、PHP5.6の時代に作られたプログラムは、PHP8.3ではそのまま動かないことがよくあります。
長い年月の間に、使えなくなった命令や、書き方が変わった部分が積み重なっているためです。
古い書き方のまま新しい環境に置くと、エラーが出るか、画面が真っ白になることがあります。
安全にするために新しくすると動かなくなる、というジレンマがここで生まれます。
まずWordPress側をPHP8.3で復旧した
残っていた素材と、動かなかったバックアップの中身を組み合わせ、
PHP8.3で動作するようにWordPress側を復旧させました。
ここで一区切りになるはずでした。
しかし、その後に同じサーバー内の古いMovable Typeも復旧してほしいという追加のご相談をいただきました。

Movable Type復旧で最初の見立てが変わった理由
Movable Typeの復旧では、最初の机上調査だけでは「PHP8では難しいかもしれない」という見立てでした。
しかし、ローカル環境で実際に動かしてみたことで、前提そのものが変わりました。
同じサーバーに16年前のMovable Typeが残っていた
Movable Typeは、WordPressが普及する前から使われていたホームページ管理ソフトです。
今回の環境には、約16年前のMovable Type 4.27が残っていました。
中には、2002年から2025年までの記事が約2,500件。
20年以上にわたって書き溜められた記録が入っていました。
- 2002年から2025年までの記事、約2,500件
- 長年の記事に紐づく写真や資料
- 過去のテンプレート、設定ファイル、管理画面
- WordPressとは別に残っていた古いCMS一式
フォルダ内のPHPファイルだけを見ると難しく見えた
初期調査では、古いシステム内にPHPで書かれたプログラム一式が見つかりました。
その中には、PHP8で廃止された書き方が大量に含まれていました。
これをすべてPHP8.3向けに書き換えるとなると、数万行規模になり現実的ではありません。
そのため、この時点では「そのままでは難しいかもしれない」という見立てになります。
実地検証でMovable Type本体はPerl/CGIだと確認した
ここで諦めず、手元の検証環境に同じシステムを再現し、実際に動かしてみました。
その結果、Movable Type本体はPHPではなくPerlという別の言語で動くことを確認できました。
- Movable Type本体はPHPではなくPerlで書かれていた
- サーバー上ではCGIという別の仕組みで動作していた
- PHP8で動かない部分は、実際には使われていない付属機能だった
- PHP8.3のサーバーでもMovable Typeを動かせる見込みが立った
つまり、最初に見えていたPHPの問題は、今回の運用方式では本体の停止原因ではありませんでした。
実際に動かして確かめなければ、「PHPファイルがあるからPHP8で動かない」と判断して終わっていた可能性があります。

Movable TypeのInternal Server Errorを切り分けた手順
Movable Typeは動くはずだと分かっても、本番サーバーではInternal Server Errorが出続けました。
エラー画面は原因を教えてくれないため、可能性を一つずつ潰していきました。
エラー画面だけでは原因を特定できない
管理画面を開くと、白い画面に「Internal Server Error」と表示されるだけでした。
この表示は、CGIの権限、Perlの実行環境、モジュール不足、設定ミスなど、さまざまな原因で出ます。
- ウイルスや不正プログラムが残っていないか
- システムを動かす言語のバージョンが合っているか
- 必要な部品やモジュールが揃っているか
- データベースに接続できているか
- サーバー設定ファイルに問題がないか
- 文字コードや改行コードが正しいか
- ファイルの権限設定が正しいか

最小のテストプログラムで原因の場所を絞った
決め手になったのは、Movable Typeとは無関係の、10行程度の小さなテストプログラムです。
同じ場所に置いて実行したところ、同じエラーになりました。
これで、Movable Type本体やデータベース処理が直接の原因ではないと分かります。
中身が何であれエラーになるなら、問題はもっと手前の実行環境にあります。
最終原因は実行権限のパーミッションだった
最終的な原因は、ファイルの権限設定から「実行の許可」が外れていたことでした。
プログラムは、読むことができても実行できなければ動きません。
サーバー会社の設備更新や移行作業の際に、こうした設定値が変わることがあります。
権限を戻したところ、管理画面は開き、記事も写真も20年分ほとんどが無事でした。
マルウェア感染サイト復旧で原因が単純でも作業が簡単ではない理由

復旧後に原因だけを見ると「設定を直しただけ」に見えることがあります。
しかし実際には、間違った前提を一つずつ検証して捨てる工程に価値があります。
- 感染調査(削除済みで痕跡が少ない状態からの推定)
- 動かないバックアップの中身を解析
- WordPressをPHP8.3環境で復旧
- Movable Typeの構成調査
- ローカル環境に再現して実地検証
- 本番サーバーのエラーを一つずつ切り分け
- 最小テストで原因の所在を特定
- 権限設定を修正して復旧
- 危険なファイルを特定して削除
原因は、最後まで探し切って初めて単純に見えます。
途中の見立てで足を止めていれば、20年分の記録は失われていたかもしれません。
今回で言えば、「PHPファイルがあるからPHP8では無理」という判断で終わっていたら、
実際には動かせるMovable Type本体まで諦めることになっていました。

マルウェア感染サイト復旧後に行ったセキュリティ対応
サイトが動いた時点で作業を終えると、同じ事故がまた起こる可能性があります。
復旧後は、不要な入口を閉じ、古いシステムをどう扱うかまで判断する必要があります。
サポート終了したMovable Typeは修正版が出ない
今回のMovable Typeはサポートが終了しており、新しい弱点が見つかっても修正版は提供されません。
古いCMSは、復旧できたからといって安全に使い続けられるとは限らないのです。
実際に、この系統のバージョンでは、外部から不正に操作される恐れのある重大な弱点も公表されています。
そのため、使わないプログラムを止め、管理画面への入口を絞る対応が必要です。
不要なファイルと危険な入口を整理した
動作に不要なプログラムと、リスクの高いプログラムを特定して削除・停止しました。
ただし、不要に見えるファイルを片っ端から消すのは危険です。
- 外部からの不正操作の入口になるプログラム
- 初期設定用・アップグレード用のプログラム
- サーバー情報を出力する調査用プログラム
- コメント投稿・トラックバックなど使っていない受付窓口
- パスワードがそのまま書かれた古い設定ファイル
最後の項目は特に注意が必要でした。
すでに使われていないファイルでも、外部から読める場所に残っていれば情報漏えいの入口になります。
管理画面のアクセス制限も行った
加えて、管理画面を決まった場所からしか開けないよう制限しました。
これだけで外部からの攻撃リスクは大きく下がります。
ただし、アクセス制限は古いCMSの脆弱性そのものを修正する方法ではありません。
あくまで攻撃される入口を減らす対策として考え、今後の移行や静的化も合わせて検討します。
マルウェア感染サイト復旧後の運用判断
無事に動いても、古いシステムをそのまま使い続けるかどうかは別の判断です。
更新を続けるのか、記録として残すのかで、最適な対応は変わります。
更新を続けるならWordPressなど現行環境へ移行する
今後も記事を書き続けるのであれば、現在広く使われているWordPressなど、
セキュリティ更新が提供される環境への移行が現実的です。
過去の記事は移行対象にできますが、文字コード、画像、URL構造、独自テンプレートによって方法は変わります。
移行前に、件数・文字化け・リンク・添付ファイルを調査することが重要です。
記録として残すだけなら閲覧専用にする
もう更新しないが、記録として残したい場合は、閲覧専用の形に作り変える方法があります。
CMSの実行プログラムを外し、静的HTMLだけを配信するイメージです。
この形にすると、管理画面や投稿機能を攻撃されるリスクを大きく減らせます。
費用も移行より抑えられる場合があり、その後の保守負担も軽くなります。
今のまま放置するのが一番危険
サーバー環境は今後も更新され続けます。
今回のように、設備更新をきっかけに突然動かなくなることは実際に起こります。
余裕のあるうちに方針を決めておくことが、結果的に一番安く済みます。
動いているうちに、復旧・移行・保存のどれを選ぶか整理しておきましょう。
マルウェア感染とMovable Type復旧のよくある質問
感染後に削除してしまった場合でも、すぐに手遅れとは限りません。
よくある質問をまとめます。
マルウェア感染で全削除されたサイトも原因を突き止めれば復旧できます
今回の案件は、マルウェア感染、全削除、動かないバックアップ、PHP8.3環境、古いMovable Typeという複数の問題が重なった事例でした。
それでも、原因を一つずつ切り分けることで、WordPressとMovable Typeの両方を復旧できました。
- 感染しても慌てて削除しない
- バックアップがあっても、そのままでは戻らないことがある
- 古いから難しいという判断は、実地検証で変わることがある
- 復旧後のセキュリティ対応まで含めて完了と考える
古いホームページのトラブルは、原因さえ突き止められれば直せることがほとんどです。
ただし、その「突き止める」ところに経験と手数が必要になります。
もし今、動かなくなったサイトを前に途方に暮れているのであれば、
何かを消してしまう前にご相談ください。
マルウェア感染後のホームページ復旧が自分で解決できない時は

ホームページの乗っ取り・マルウェア感染・古いCMSの復旧でお困りなら、
クイックレスキューが現物を確認して解決方法を探します。
- マルウェア感染後にファイルを削除してしまった
- バックアップを戻してもサイトが動かない
- 古いMovable TypeやCMSを復旧したい
- 制作会社と連絡が取れず、引き継ぎ資料もない
- 古いPHP環境から安全に復旧したい
- 復旧後の安全対策や移行までまとめて相談したい
- 万一復旧できない場合やマルウェア駆除できない場合は全額返金保証で安心
- 90日間再感染保証・動作保証で安心
- 初期費用・調査費用0円で安心
