どうも、Web業界の片隅で20年近くPHPを書いてきたエンジニアです。今回は、WordPressサイトがハッキングされた後に、攻撃者がこっそり残していく「バックドア」について、僕の実体験も交えながら、その典型的なパターンと発見方法を徹底的に解説していきます。正直、このバックドアってやつが一番タチが悪い。せっかくマルウェアを駆除しても、こいつが残ってると、またすぐに「おかえりなさい」って感じで攻撃者に侵入されちゃうんですから。
忘れもしない、あの日の「おかしい」
あれは、あるクライアントのECサイトで、原因不明のサーバーダウンが頻発したときのこと。ログを見ても、アクセスが急増してるわけでもない。でも、なぜかCPU使用率が定期的に100%に張り付く。「なんだこれ?」って首を傾げながら、深夜にサーバーの中を隅々まで探検してたんです。そしたら、見つけちゃったんですよ。/wp-content/uploads/の中に、画像ファイルに偽装された、たった1行のPHPファイルを。
中身は、案の定、eval(base64_decode(...))のオンパレード。一見すると意味不明な文字列の羅列。でも、デコードしてみたら、外部からの命令を何でも実行できちゃう、立派なバックドアでした。あの時の、背筋がサーッと凍る感覚は今でも忘れられません。犯人は、このバックドアを使って、僕らのサイトを踏み台に、他のサイトへ攻撃を仕掛けていたんです。そりゃサーバーも落ちるわけだ…。
この記事を読んでるあなたも、もしかしたら、気づかないうちに「裏口」を開けっ放しにしちゃってるかもしれませんよ?
そもそも「バックドア」って何?なんでそんなにヤバいの?
バックドアっていうのは、その名の通り「裏口」のこと。一度サイトに侵入した攻撃者が、次からは正規のログイン手順(IDやパスワード)をすっ飛ばして、いつでも自由にサイトにアクセスできるように設置する、特別なプログラムです。
これがなんでそんなにヤバいかっていうと、「永続性」があるから。普通のハッキングなら、パスワードを変更したり、脆弱性のあるプラグインを修正すれば、とりあえず攻撃者を締め出せます。でも、バックドアが残っていると、いくら戸締りしても、攻撃者は勝手口から何度でも自由に出入りできちゃうんです。まるで、合鍵を渡してしまっているようなものですね。
そして、このバックドア、めちゃくちゃ巧妙に隠されています。攻撃者もプロですから、簡単には見つからないように、あの手この手で偽装してきます。
【ここが危ない!】バックドアが隠されやすい場所ワースト7
僕の経験上、バックドアがよく隠されているのは、以下の7つの場所です。自分のサイトと見比べながら、チェックしてみてください。
| 隠し場所 | なぜ狙われるのか? | 典型的な手口 |
|---|---|---|
1. wp-content/uploads/ | 画像などをアップロードするフォルダ。PHPファイルがあるはずのない場所なので、油断しがち。 | 画像ファイル(.jpg)に偽装したPHPファイル、一見無害な名前のPHPファイル(例: hello.php) |
| 2. 使用していないテーマ | 有効化していないテーマは更新されにくく、放置されがち。WordPressの更新でも上書きされない。 | functions.php や index.php に数行のコードを追加する。 |
| 3. プラグインフォルダ | テーマと同様、更新から漏れやすい。特に、もう使っていないプラグインは格好の隠れ場所。 | 正規のファイルに紛れ込ませる、あるいはプラグイン自体がバックドアを持つマルウェアだったりする。 |
4. wp-config.php | データベース接続情報など、超重要な情報が書かれているファイル。ファイルの先頭にコードを1行追加するだけで、サイトの全リクエストを乗っ取れる。 | ファイルの先頭や末尾に、難読化されたコードを1〜2行追加する。 |
5. wp-includes/ | WordPressのコアファイルがたくさん入っているフォルダ。ファイル数が多く、普段は誰も見ないので、偽のファイル(例: wp-user.php)を紛れ込ませても気づかれにくい。 | 正規のファイル名に似せた偽ファイル(例: class-wp-http.php → class-wp-http.php.bak)を置く。 |
6. index.php | WordPressのルートディレクトリにある index.php。すべてのアクセスの起点になるため、ここに仕込まれると影響大。 | ファイルの先頭に、特定の条件下でのみ発動するコードを埋め込む。 |
7. wp-content/mu-plugins/ | Must-Use Plugins(必須プラグイン)を置く場所。ここに置かれたPHPは自動的に実行され、管理画面から停止できない。非常に厄介。 | 無害なユーティリティプラグインに偽装したバックドアを設置する。 |
特に最近(2025年時点)の攻撃では、7番目のmu-pluginsが悪用されるケースが増えてきています。ここは専門家でも見落としがちな場所なので、要注意です。
【解読不能?】攻撃者が使うバックドアの典型的なコードパターン
じゃあ、具体的にどんなコードがバックドアとして使われるのか。攻撃者は検出を逃れるために、コードをわざと読みにくく(難読化)します。いくつか典型的なパターンを見てみましょう。
パターン1: eval(base64_decode(...))
これはもう、バックドアの「王道」中の王道。base64_decodeで暗号化された文字列を元に戻し、evalでそれをPHPコードとして実行します。こんな感じのコードを見つけたら、99%黒だと思ってください。
// 一見、意味不明な文字列が…
@eval(base64_decode('aWYoIWZ1bmN0aW9uX2V4aXN0cygid29yZHByZXNzX2F1dGhfY2hlY2siKSl7ZnVuY3Rpb24gd29yZHByZXNzX2F1dGhfY2hlY2soJHVzZXJuYW1lLC hallwayswYXNzd29yZCk...'));
パターン2: 文字列の連結・置換
evalやbase64_decodeといった、いかにも怪しい関数名を直接書かずに、文字列をバラバラにして連結したり、置換したりして検出を逃れようとします。
$a = 'ba'.'se'.'64_de'.'co'.'de'; // base64_decode
$b = str_replace('xyz', '', 'evaxyzl'); // eval
$b($a(...));
パターン3: 外部ファイルの読み込み
バックドア本体は別のファイルに隠しておき、実行用のファイルからはそれを読み込むだけ、というパターン。uploadsフォルダに置かれた.txtファイルからコードを読み込んで実行、なんて手口もあります。
// uploadsフォルダの怪しいテキストファイルを読み込んで実行
$code = file_get_contents('/home/user/public_html/wp-content/uploads/2025/10/cache.txt');
eval($code);
パターン4: AES暗号化(最新の手口)
最近の高度なバックドアは、通信内容をAESなどで暗号化しています。これにより、どんな命令を送っているのか、外部から解析するのが非常に困難になります。ここまで来ると、もう専門家の出番ですね。
バックドアを発見するための実践的ステップ
「じゃあ、どうやって見つければいいんだ!」って声が聞こえてきそうですね。大丈夫、落ち着いてください。いくつか方法はあります。
ステップ1:セキュリティプラグインでスキャンする
まずは、これが一番手軽で効果的です。「Wordfence Security」や「Sucuri Security」、「MalCare」といった有名なセキュリティプラグインには、マルウェアやバックドアを検出するスキャン機能がついています。まずは、これらのプラグインをインストールして、サイト全体をスキャンしてみましょう。既知のパターンの多くは、これで見つかるはずです。
ステップ2:ファイルの変更を監視する
WordPressのコアファイルやテーマ、プラグインのファイルが、意図せず変更されていないかチェックします。手動でやるのは大変なので、これもプラグインの力を借りましょう。上記のセキュリティプラグインには、ファイルの変更監視機能もついています。コアファイルとの差分を比較して、怪しい変更がないか確認できます。
ステップ3:怪しいファイルを手動で探す(上級者向け)
プラグインでも見つからない、もっと巧妙なバックドアを探すには、サーバーにSSHでログインして、コマンドを叩くのが一番です。エンジニア向けのやり方ですが、いくつか紹介します。
1. 最近変更されたファイルを探す
# 過去7日間に変更されたPHPファイルを探す
find . -name "*.php" -mtime -7
身に覚えのない日時に変更されたファイルがあったら、要注意です。
2. 怪しいコードをgrepで探す
# eval(base64_decode(...)) を探す
grep -r "eval(base64_decode" /path/to/wordpress/
# 難読化されたコードを探す(文字数が多くて怪しい行)
grep -rE ".{200,}" /path/to/wordpress/
ステップ4:不審なユーザーがいないか確認する
WordPressの管理画面にログインし、「ユーザー」一覧を確認します。自分や他の管理者が追加した覚えのない、見知らぬ管理者ユーザーがいたら、それは攻撃者が作ったアカウント(バックドアの一種)である可能性が非常に高いです。すぐに削除しましょう。
もしバックドアを見つけたら?
もしバックドアらしきものを見つけても、慌ててそのファイルだけを削除してはいけません。それは、トカゲの尻尾切りに過ぎないからです。バックドアが設置されたということは、その原因となった脆弱性が必ずどこかに存在します。その大元を塞がない限り、何度でもバックドアは設置されてしまいます。
- サイトをメンテナンスモードにする
- バックアップを取る(現状の証拠保全のため)
- バックドアのコードを無害化する(削除するのではなく、コメントアウトするなど)
- 侵入経路となった脆弱性を特定し、修正する(これが一番重要!)
- WordPress本体、テーマ、プラグインをすべて最新版に更新する
- すべてのパスワード(DB、FTP、WordPressユーザー)を変更する
- WordPressのコアファイルを再インストールする
正直、4番の「脆弱性の特定」は、専門家でないとかなり難しい作業です。もし自力での復旧に自信がなければ、変にいじって状況を悪化させる前に、迷わず僕らのような専門業者に相談してください。
【実例から学ぶ】バックドア発見の現場レポート
僕が過去に経験した、実際のバックドア発見事例をもう一つ紹介しておきます。これ、本当にゾッとした案件でした。
あるクライアントのサイトで、「最近、サイトの表示が遅い」という相談を受けたんです。最初は「キャッシュの問題かな?」くらいに思ってたんですが、調べてみると、なんとwp-content/mu-plugins/の中に、見覚えのないファイルが3つも入ってました。
ファイル名はwp-cache.php、wp-optimize.php、wp-performance.php。一見すると、キャッシュ系やパフォーマンス改善系のプラグインっぽい名前ですよね?でも、クライアントに確認したら「そんなの入れた覚えない」って。
中身を見てみたら、案の定、AES暗号化されたバックドアでした。しかも、3つのファイルが互いに連携して動作する、かなり高度な仕組み。一つを削除しても、残りの二つが自動的に復活させる、みたいな。まるでゾンビですよ。
最終的には、サーバーのアクセスログを徹底的に解析して、侵入経路を特定。古いバージョンのプラグインの脆弱性を突かれていました。バックドアを完全に駆除して、脆弱性を塞いで、やっと一件落着。でも、あの時の緊張感は今でも忘れられません。
こういう経験があると、「セキュリティは後回しにしちゃダメだ」って、本当に身に染みて感じますね。
よくある質問(FAQ)
Q1. バックドアが設置される一番の原因は何ですか?
A. 圧倒的に多いのは、プラグインやテーマの脆弱性です。特に、長年更新されていないものや、非公式サイトからダウンロードしたものは危険です。次に多いのが、推測されやすい簡単なパスワードを使っているケースですね。
Q2. セキュリティプラグインを入れていれば100%安全ですか?
A. 残念ながら、100%はありません。セキュリティは、攻撃者との「いたちごっこ」です。プラグインは既知の脅威には強いですが、未知の攻撃(ゼロデイ攻撃)や、今回紹介したような巧妙に隠されたバックドアを完全に見つけられるとは限りません。複数の対策を組み合わせることが重要です。
Q3. 使用していないテーマやプラグインは、停止しておくだけではダメですか?
A. ダメです。停止しているだけだと、ファイルはサーバー上に残ったままです。そのファイルに脆弱性があれば、攻撃者に悪用される可能性があります。使わないものは、必ず「削除」してください。
Q4. バックドアを自力で駆除する自信がありません…
A. 無理は禁物です。下手に触ると、サイトが完全に壊れてしまったり、重要な証拠を消してしまったりする可能性があります。少しでも不安を感じたら、すぐに専門のセキュリティ業者に連絡することをお勧めします。早期対応が被害を最小限に抑える鍵です。
Q5. バックドアが設置されているかどうか、事前に予測する方法はありますか?
A. 完全に予測するのは難しいですが、いくつかの兆候はあります。例えば、サーバーのCPU使用率が異常に高い、見覚えのないファイルが増えている、管理画面のユーザー一覧に知らないアカウントがある、などです。定期的にサイトの健康診断をすることで、早期発見につながります。
まとめ:バックドア対策は「日々の健康診断」と同じ
バックドアは、一度設置されると本当に厄介な存在です。でも、その手口や隠されやすい場所を知っておくだけでも、発見できる可能性は格段に上がります。
- 怪しい場所を知る:
uploadsやmu-pluginsなど、狙われやすい場所を意識する。 - 怪しいコードのパターンを知る:
evalやbase64_decodeは危険のサイン。 - 定期的なチェックを怠らない: セキュリティプラグインでのスキャンや、ファイルの変更監視を習慣にする。
- 基本を徹底する: アップデート、強力なパスワード、不要なテーマ・プラグインの削除。
結局のところ、セキュリティ対策は、僕らが毎日歯を磨いたり、定期的に健康診断を受けたりするのと同じなんです。面倒くさいけど、やっておかないと、後でもっと大変なことになる。皆さんの大切なサイトが、攻撃者の「隠れ家」にならないように、今日からでも、ぜひ実践してみてください。
WordPressのセキュリティ、不安に感じていませんか?
「自分のサイトは大丈夫だろうか…」「バックドアが潜んでいないか心配…」
もし少しでも不安を感じたら、プロによるセキュリティ診断をお勧めします。
私たち「WordPressセキュリティ診断サイト」では、専門家があなたのサイトを徹底的に調査し、潜在的なリスクを洗い出します。