【WordPress】ハッキング?サイトアクセスで変なリダイレクトを調査。原因はevalを探すと見えてくる?

現象

ワードプレスで作成されたサイトにアクセスすると、謎のリダイレクトが起きる現象がありました。前日まではリダイレクトされず正常に表示されていました。おそらくハッキング(正しくはクラッキング)されています。その現象を調査する機会がありましたので、メモしておきます。

  1. サイトにアクセスする
  2. しばらくすると知らないページに勝手にリダイレクトする
  3. そのページを放置しておく
    ※私はテスト的に行っています。通常であれば、すぐページを閉じた方が良いと思います
  4. 勝手にファイルをダウンロードしようとする(保存するかどうか聞かれる※ブラウザや設定によると思います)
    ※何が起きるかわかりませんので、ダウンロードはしないでください

対処方法

該当プラグインを停止する。

ただ、直接的な解決ではありません。クラッキングされたということは情報が相手に知られている可能性が高いので、パスワードを一式変更、ワードプレスのセキュリティ強化等行う必要があります。

該当するプラグインの探し方

原因となるワード

今回のケースでは、下記のようなソースが「wp_head()」によって読み込まれていることが原因のようでした。

<script type=text/javascript>eval(String.fromCharCode(数字, 数字,・・・));</script>

※数字=2桁か3桁の数字です

「eval(String.fromCharCode」このワードが探すべきワードになります。「eval」や「String.fromCharCode」で調べてみてください。ちなみに、googleさんのSearchConsoleのヘルプにも「eval」については記載されていました。
>ハッキングのタイプ: コード インジェクション – Search Console ヘルプ

探す場所

今回のケースでは、このワードはファイル上ではなく、DB内で発見しました。よって、ファイル内だけではなく、DB内も調べる必要があります。

DB内を調査

「phpmyadmin」等でDBにアクセスし、該当DBの全データをSQL形式で良いのでエクスポートします。エクスポートしたファイルをテキストエディタで開き、「eval(String.fromCharCode」などのワードを検索してください。「eval」だけでも十分かもしれません。

すると、該当箇所が見つかります。該当行を確認するとDBからその情報を取得するための「キーワード」がみつかるかと思います。今回の場合は、下記のような感じでした。

(100, 'キーワード', '…<script language=javascript>eval(String.fromCharCode(~);</script><style>…', …),

実際は「キーワード」と入っているわけではなく「何かしらの文字列」が入っています。

具体的に表記しない理由

具体的に表記しない理由は、プラグインが特定できるためです。プラグインはクラッキングに利用されているだけで、プラグインに問題があるわけではありません。特定することでプラグインの評価を下げる可能性を考慮し具体的には表記しませんでした。書いた方がヒントになるかと思いますが、すみませんm(__)m

WP関連ファイル内を検索・解決

前項「DB内を調査」で発見した「キーワード※何かしらの文字列」をキーにWP側で値を取得しているはずです。よって、WPに関するファイルすべてを対象に「キーワード」を検索します。

今回の場合は、「wp-content\plugins\プラグイン名」配下のファイルに「キーワード」を見つけることができました。これによって、プラグイン名が特定できましたので、そのプラグインを停止しました。すると、謎のリダイレクトは起きなくなりました。

「wp-content\plugins」配下のみワード検索してみてもいいですが、「wp-admin」や「wp-includes」フォルダも含め全体的に検索した方が発見できる可能性は高くなると思います。

以上、特定したプラグインを停止することで、不正なリダイレクトは止めることができました。

以下、今後別件の調査のためのメモになります

今回の事象とは直接関係ありませんので、以下の情報で問題解決は望みが薄いと思います。ご了承ください。

今後別件の調査をする上で、調査方法として参考程度にメモしておきます。乱文なので不明点等ありましたらコメントください。出来る範囲でご説明します。

原因となるワードを発見するまでの流れ

原因特定のために、まずテスト用の固定ページ(slug=test)を用意しました。その固定ページでも同じく不正なリダイレクトが発生しました。

次に、「page-test.php」というファイルを作成し、中身を空にしてアップロードしました。これで固定ページ「test」は空の状態になります。すると不正なリダイレクトは起きなくなりました。よって、原因はワードプレス内と推測できました。リダイレクトが「.htaccess」やその他の方法で設定されている可能性は有る程度排除できました。

次に、「page-test.php」の中身を「page.php」と完全に同じにしました。すると、不正なリダイレクトが発生するようになりました。更に原因を絞り込むために「get_header()」「get_footer()」を削除して試してみました。すると、「get_header」を消すと不正なリダイレクトは止まりました。
※「wp_head」や「wp_footer」で読み込まれる部分が原因かなと予想していたので、「get_header()」「get_footer()」を削除してみました

「get_header()」に原因がありそうなので、「header.php」の中身をコピーして「page-test.php」に貼り付けました。それ以外の不要な箇所は削除しました。下記のような感じです。これでも不正なリダイレクトは起きましたので、更に絞り込んでいきます。

<!DOCTYPE html>
<html>
<head>
「header.php」の中身を貼り付けた
</head>
<body>
</body>
</html>

前述したとおり「wp_head」に問題があると思っていましたので、下記のようにしてみたところ、こちらでも不正なリダイレクトは発生しました。

<!DOCTYPE html>
<html>
<head>
<?php wp_head(); ?>
</head>
<body>
</body>
</html>

「wp_head()」で読み込まれる何かが原因まで絞り込めました。
次にブラウザ上でリダイレクト前にソースを開きました。すぐにリダイレクトされてしまいますが、1秒くらいはあります。その間にCtrlUを行うとリダイレクト前のソースを表示できます。そこで、「wp_head」で実際に読み込まれたソースをコピーして「page-test.php」に貼り付けました。

<!DOCTYPE html>
<html>
<head>
wp_head()によって実際に読み込まれたhtmlを直接貼り付け
</head>
<body>
</body>
</html>

ここからは、貼り付けた内容から問題なさそうな箇所(怪しい「script」タグ以外)を一部削除してみては、不正なリダイレクトが起きるかを確認していきました。繰り返しこの作業を行っていった結果、最終的に1つの「script」タグが残りました。それが下記でした。下記ソースのみで不正なリダイレクトは発生しました。

<!DOCTYPE html>
<html>
<head>
<script type=text/javascript>eval(String.fromCharCode(数字, 数字,・・・));</script>
</head>
<body>
</body>
</html>

よって、「eval」「String.fromCharCode」が原因と判断できました。

evalとは

そもそもevalとは何でしょう。「eval」とは文字列として表記されたJavaScript コードを式として評価、つまり実行してくれます。今回の場合は、文字列部分がコード化されていて、分かりにくくされていました。

分かりにくくされていましたが、その部分にリダイレクトの処理が書かれていたのだと思います。

今回の経験から

クラッキングが疑わしい場合は、ひとまず「eval」を検索してみるのが良いかもしれないです。