ハッキングされたWordPressを復旧する方法【3】データベースを回復させる

WordPress_Eyecatch

WordPressで運営中のサイトが乗っ取り被害を受けてしまいました。

その際、私が復旧/復元のために行った内容を備忘録として記事にまとめました(長くなったので 記事を分けています)。

この記事は「3. データベースを回復させる」方法を紹介しています。

WordPressは「本体(サイトデータ)」と「データベース」という2種類のデータで構成されています。

はじめに「本体データ」を復元し(こちらの記事で紹介)、その後で「データベース」の復元(この記事で紹介)を行っていきます。

一言メモ
記事内で「復元用バックアップデータ」と呼んでいるものは、被害を受けた状態の本体データおよびデータベースのバックアップファイル(いわば最新状態のバックアップ)のことを指します。※こちらの記事の「復元用バックアップをダウンロードする」の項目を参照してください
phpMyAdminでデータベースを復元する

最後に データベースを復元していきます。

不正コードが仕込まれた場所が、記事本文内だけであれば、WordPressのダッシュボードから Search Regexプラグインなどを使って検索&削除することが可能です。

ただ私の場合、画像ファイルの説明欄やリビジョン(記事の修正履歴)にも不正なスクリプトが仕込まれており、Search Regexプラグインでは それらの場所にリーチすることができませんでした。

そこで、データベースに仕込まれた不正なスクリプト/コードを発見&削除するために、サーバが用意している「phpMyAdmin」で作業を行いました。

一言メモ
phpMyAdminの開き方は各レンタルサーバーで確認してください

不正なスクリプトを削除する

不正なスクリプトを「みつける」

まずは、データベース内に仕込まれている不正なスクリプト/コードをみつけていきましょう。

phpMyAdminにログインしたら、左カラムの当該データベース部分を選択し「検索」タブをクリック。

「検索するテーブル」で全選択をクリックし「検索する単語や値」欄に それっぽいワード(<script>など ※後述)を入力して「実行」ボタンをクリックします。

それっぽい「ワード」とは?

ハッキングのスクリプトに入っていそうなコードです。・・・と言っても、分からないと思いますので、ひとまず以下を試してみましょう。

  • <script>
  • fromcharcode など
検索結果を確認する

検索した単語(ここでは<script>)を含むテーブルと、その数が表示されます。

上図の場合「テーブル wp_options:13件」「テーブル wp_postmeta:95件」「テーブル wp_posts:2500件」「wp_usermeta:2件」で、それぞれヒットしています。

注意

ここでヒットしたものがすべて不正なものというわけではありません。例えば<script>タグは、Googleタグマネージャやアドセンスのコードにも含まれていますので注意が必要です。

詳細を確認する

ヒットしたものは ひととおり確認が必要ですが、ここではひとまず「テーブル wp_posts(=投稿記事のデータベース)」の内容をみてみましょう。

「テーブル wp_posts」の表示をクリックして、詳細な結果を表示させます。

当該テーブル(ここではwp_posts ※投稿記事の情報)の一覧が表示されます。

「行フィルタ:」に、再度ワード(<script>)を入力してさらに絞り込みをかけます。

すると「post_content」カラムに「<script>var f=String~」で始まるコードが含まれていることが分かりました。

一言メモ
私は投稿記事内で<script>タグを使った覚えはないので どうも怪しいですね・・・

とりあえずひとつを選んで展開してみると・・・

記事本文のお尻に「<script>var f=String;eval(f.fromCharCode(★★★,★★★, ~ </script>」というコードが仕込まれていました。

これは、私が書き込んだものではなくハッキングによって不正に挿入されたスクリプトです。

ひとまず、このコードの全文をコピーして控えておきます。

同じスクリプトを含むデータベースを抽出する

不正ハッキングの場合、同じ内容のコードが あちこちに挿入されるのが一般的です。

私の場合、見つけ出した上記のコードの全文をキーワードにして、再度「検索」をかけてみると「wp_posts」に2500件のヒットがありました。続いては これを削除していきます。

一言メモ
再検索する場合は、再度「当該データベースを選択 > 検索タブ」で 検索しましょう。

不正なスクリプトを「削除する」

再度、当該データベースを選択し直し「SQL」タブを開きます。

「データベース ○○ 上でクエリを実行する:」の空欄部分に「文字置換用クエリ(※後述)」を入力し「実行」ボタンを押します。

文字置換用クエリ
update テーブル名 set カラム名=replace(カラム名, "置換前の文字列", "置換後の文字列");

今回の事例だと「テーブル:wp_posts」内の「カラム:post_content」にあるコードを削除したいので、以下のような感じになります。

update wp_posts set post_content=replace(post_content, "不正スクリプトの全文", "");

置換前の文字列には、「挿入されていた不正スクリプト(削除したいコード)の全文」を入れます。置換後の文字列部分は、空欄で大丈夫です。

「実行」ボタンをクリックすると、クエリが実行されます。「○○行変更しました」と表示されたら、削除成功です。

・参考:phpmyAdmin でSQL を実行して文字列を置換する方法
https://www.webantena.net/wordpress/phpmyadmin-update-set-replace/
削除できたか確認する

再度、ワード検索をかけて、無事に削除できたか確認しましょう。

同じ要領で検索&削除を繰り返す

仕込まれた 不正コード/スクリプトは1つとは限りません。

同じ要領で、不審そうなワードを検索、削除・・・を繰り返します。

不審なユーザーを削除する(データベース編)

最後に、phpMyAdminで不審なユーザー情報を確認&削除する方法をメモしておきます。

「wp_users」で情報を確認する

ユーザー情報は「wp_users」テーブルに保存されています。当該データベースを選択し「wp_users」をクリックします。

ユーザの一覧が表示されますので、不審なユーザをみつけたら、チェックをいれて削除します。

一言メモ
WordPressのダッシュボードからもユーザーの削除は可能です。ダッシュボードにログインできない場合は、こちらのデータベースからの削除方法を試してください。

まとめ:

以上で「3. データベースを回復させる」方法の紹介は終了です。

また、WordPress全体の復元自体も完了になります。

一連の記事はあくまで、私の事例に対して私が行った対処法の紹介に過ぎません。これだけでは解決しない場合も十分考えられますので その点ご注意ください。

今後 同様の被害に合わないためにもログインパスワードの変更やセキュリティ系プラグインの導入など対策を行いましょう。