Drupalサイトがスパムページにリダイレクトされるハッキング:症状・原因・対処法を徹底解説
Drupalは非常にセキュアなCMSとして知られ、その高い安全性こそが人気の理由でした。オープンソースCMSであるDrupalは堅牢性で定評があり、ソースコードが公開されていることから、バグバウンティハンターにとっては宝の山でもあります。しかしその一方で、近年は悪名高い「Pharma Hack(ファーマハック)」から「Kitty Cryptomining Malware(キティ暗号資産マイニングマルウェア)」まで、さまざまな攻撃に見舞われてきました。そして最近増加傾向にあるのが、サイトへのアクセスをスパムページへ強制的に誘導する「Drupalハックリダイレクト」です。
Drupalリダイレクトハックは、攻撃者がWebサイトの脆弱性を突いてコンテンツを改ざんし、マルウェアを仕込むことで発生します。その結果、訪問者はスパム性のある怪しいリンク先へと誘導されてしまいます。フィッシングページや、バイアグラなどを販売するアダルトページへ飛ばされるという被害報告も多数寄せられています。
Drupalハックリダイレクトの症状
このリダイレクト感染には、主に以下の2つのパターンがあります。
- ホームページにアクセスしただけでスパムページへリダイレクトされる
- ボタンやリンクをクリックすると、バイアグラやシアリスを販売する偽薬局ページへ飛ばされる
2つ目のパターンに感染していないかを確認するには、Google dork(Google検索演算子)が便利です。以下の検索式で、実際の状況をつかむことができます。
site:your-website.com "viagra"
この検索式では、バイアグラ関連ページへリダイレクトしているDrupalサイトが一覧表示されます。「viagra」を「poker」「porn」「loans」などのキーワードに置き換えれば、他のリダイレクトも調査可能です。
検索結果の最初のサイトのリンクをクリックすると、次のようなエラーが表示されました。
これは攻撃者がサイトを侵害し、リダイレクトが仕掛けられていたことを示しています。ただし、他の要因により、現在はリダイレクトが機能していない可能性もあります。
Drupalハックリダイレクトの種類(HTTPステータスコード)
- 301リダイレクト:恒久的なリダイレクトです。Googleなどの検索エンジンは「このURLは新しい場所へ移転した」と判断し、それまでの評価や関連付けを引き継ぎます。仕組みがシンプルなため、攻撃者に最も利用されやすい手法です。
- 302リダイレクト:一時的な移動を示すステータスコードですが、現在は303へ置き換えられつつあり、使われることは減っています。
- 303リダイレクト:302の改良版です。将来的に同じアドレスに存在しない可能性がある一時的なページ(クレジットカード入力フォームなど)を提供します。極めて高度な攻撃でない限り、攻撃者が使うケースは少ないでしょう。
- 307リダイレクト:303の亜種で、細部に違いがあります。さらに実験的な308リダイレクトも存在しますが、実際に使われる可能性は低いものの、完全に排除はできません。
Drupalマルウェアリダイレクトの兆候
- 異常に多いアクセス数
- Drupalサイトに不明なファイルが追加されている
- 管理者権限を持つ新規ユーザーが勝手に作成されている
- ホームページ上のリンクをクリックするとスパムサイトへ飛ぶ
- 悪質な広告やポルノのポップアップが表示される
- 見覚えのないノードやファイルが現れる
- 検索エンジンにスパムコンテンツが表示される
- GoogleやBingなどによるセキュリティ警告やブラックリスト登録
Drupalハックリダイレクトの原因
原因は多岐にわたり、1つの記事で網羅することは困難ですが、主要な原因を順に見ていきましょう。
DNSリダイレクト
DNSサーバーのエントリーが改ざんされると発生します。誰かがあなたのサイトへアクセスしようとすると、DNSサーバーが改ざんされたエントリーへユーザーを誘導します。簡易的なチェックとしてDNSルックアップを実行してみましょう。Windowsならtracert www.your-site.com、Linuxならhost www.your-site.comコマンドを使用します。結果として誤ったIPアドレスが返ってきた場合、問題はWebサイト自体ではなくDNS側にあるということです。より詳しく調べたい場合は、不正なDNSサーバーエントリーがないか確認してください。
ファイルの改ざん
攻撃者が.htaccessやindex.phpファイルを改ざんしている可能性があります。内部に悪意あるコードが仕込まれていないか確認しましょう。典型的なコードは以下のような形式です。
data:text/html,<html><meta http-equiv="refresh" content="0; url=https://malicious_site.com/process/route/1673246826.html?refresh=non-ie&bl=0"></html>
このコードは、Webサイトをhttps://malicious_site.comへリダイレクトさせています。
コアファイルの整合性確認
すべてのファイルを目視で確認するのは非現実的です。そこでまず、インストール済みファイルのコア整合性チェックから始めましょう。
mkdir drupal-8.3.5
cd drupal-8.3.5
wget https://github.com/drupal/core/archive/8.3.5.tar.gz
tar -zxvf core-8.3.5.tar.gz
1〜2行目でdrupal-8.3.5というディレクトリを作成して移動し、3行目でGitHubリポジトリからオリジナルのインストールファイルをダウンロード、4行目で展開します。次が重要な比較フェーズです。diff -r core-8.3.5 ./public_htmlこのコマンドを実行すれば、現在のファイルとオリジナルとの差分を確認できます。この手順を繰り返して、すべてのファイルをチェックしていきましょう。
その他の原因
- SQLインジェクション:1998年に初めて公表された古典的な攻撃手法でありながら、今なお多くのサイトを悩ませています。原因はサニタイズ(無害化)されていない入力値で、コーディング時のセミコロン1つの見落としが脆弱性につながることもあります。
- 不審なモジュールの確認:
modules/system/wxeboa.phpのような怪しいファイル名は、オリジナルのDrupalには存在しません。見つけたら即座に対処しましょう。 - Google透明性レポート:原因調査の強い味方になります。自サイトに関する多くの情報を確認できます。
- 脆弱なパスワード:FTPや管理画面のパスワードが弱い、あるいはデフォルト設定のままの場合は、今すぐ変更してください!
Drupalハックリダイレクトの被害拡大防止策
リファラー内のキーワードによるブロック
サイバーセキュリティの鉄則は「攻撃を完全に防ぐことはできず、遅らせることしかできない」というものです。その観点から有効なのが、.htaccessファイルの編集です。あらかじめ設定しておけば、仮に将来感染が発生しても、スパムへのアクセスを自動的にブロックできます。これによりユーザーの信頼が保たれ、たとえ感染していても検索エンジンからのブラックリスト登録を回避しやすくなります。時間を稼ぎ、検索ランキングの急落を防ぐ、いわば「被害抑制(ダメージコントロール)」として機能します。
<Limit GET>
order allow,deny
allow from all
deny from env=spammer
SetEnvIfNoCase Referer ".*(Poker|credit|money).*" Spammer
</Limit>
このコードは、HTTPリファラーを識別情報として、pokerやcreditなどのキーワードを含むページへのアクセスをブロックします。自サイトにこうした単語が含まれていないのであれば、これらのワイルドカードフィルタで安全に遮断できます。
サイト自身の識別子によるブロック
もう1つの方法は、HTTPリファラーに基づくアクセス制御です。
RewriteEngine On
RewriteBase /
# 検索エンジンからの参照を許可:
RewriteCond %{HTTP_REFERER} !.*xyz\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^https://([^/]+)google\..*$ [NC]
googleの部分をyahoo、bingなど、許可したい検索エンジンの分だけ置き換えて追記していきます。
# ブロックしたい参照元の条件:
RewriteCond %{HTTP_REFERER} ^.*loans.*$ [OR]
loansの部分をviagraやpornなど、ブロックしたいスパムワードに置き換えます。なお、この設定を機能させるにはApacheのModRewriteが有効になっている必要がある点に注意してください。また、スパム行為で悪名高い特定のIPアドレスを制限に加えるのも効果的です。
Drupalマルウェアリダイレクト感染サイトの駆除
データベースのクリーンアップ
ユーザーの確認
まずはSQLインジェクションの痕跡を調べましょう。show tables;コマンドで全テーブルを表示し、Sqlmapのような不審なテーブルがないか確認します。Sqlmapという名前のテーブルは、自動ペネトレーションテストツール「Sqlmap」によるジャンククエリの実行時に生成されたものである可能性が高いです。また、攻撃者が新規ユーザーエントリーを作成し、管理者権限を奪取している恐れもあります。以下のクエリで確認できます。
Select * from users as u
AND u.created > UNIX_TIMESTAMP(STR_TO_DATE('Oct 15 2018', '%M %d %Y'));
この例では2018年10月15日以降に作成された全ユーザーが表示されます。日付は任意のものに変更してください。不正なユーザーやテーブルを検出した場合は、drop database database-name.dbo;で削除できます。
ユーザーのブロックとパスワードリセット
さらに、不審なユーザーをブロックしたり、全ユーザーのパスワードを一括変更したりできます。次のコマンドを使用します。
update users set pass = concat('ZZZ', sha(concat(pass, md5(rand()))));
このSQLステートメントは、ユーザーのパスワードをMD5形式のハッシュ値へ変更します。MD5は暗号学的セキュリティ関数です。パスワードを平文のまま保存してはいけません。データベースが侵害されれば、攻撃者は平文パスワードを容易に抽出できてしまうからです。ハッシュ化しておけば追加の防御層になります。例えば「admin」という文字列は86fb269d190d2c85f6e0468ceca42a20というハッシュ値になり、一方向関数であるため逆算は極めて困難です。
ファイルのクリーンアップ
- 感染前のバックアップコピーへファイルをロールバックする
- 外部モジュールで感染スキャンを行う(hackedモジュールが定番)
- 機密ファイルへのアクセスを、ルートディレクトリ外から禁止する
- エラーレポートを無効化し、機密情報の漏洩経路を塞ぐ
- インストールが古い場合は、今すぐ・すぐに・必ずアップデートする
- 使用中だったAPIキーやFTPパスワードをすべてリセットし、強固なパスワードを設定し直す
drush cache-rebuild(Drupal 8)またはdrush cache-clear all(Drupal 7)でキャッシュをクリアする- WAF(Webアプリケーションファイアウォール)を導入し、Drupalリダイレクトハックへの追加防御層とする
とはいえ、駆除後も予期せぬ問題が残る可能性はあります。原因を特定できない場合は、専門家への相談を検討しましょう。手動での駆除が負担に感じる場合は、自動ツールの活用も有効です。また、CMSで発見された脆弱性情報はブログや公式サイトで定期的にチェックし、常に最新の状態を維持することが重要です。
-
OpenCartアカウントが停止される原因と復旧方法を徹底解説
OpenCartストアのアカウントが停止されていませんか?ホスティング会社がOpenCartストアを停止する理由はさまざまですが、最も多いのは利用規約違反、支払い不履行、マルウェア感染、サイト上のスパムなどです。ウェブストアが停止されれば、売上の損失は避けられず、顧客に不便を強いることになり、最悪の場合は店舗の信頼性そのものが損なわれます。停止されたOpenCartストアの復旧には相応の手間と時間がかかります。本記事では、OpenCartアカウント停止メッセージの種類とその原因を詳しく解説し、停止されたアカウントを復旧させるための具体的な方法をご紹介します。OpenCartアカウント停止メッセ
-
PHPリダイレクトハックとは?被害の仕組みと5ステップの対処・駆除方法を徹底解説
自社のPHPサイトが、ユーザーを悪意のあるウェブサイトへ勝手にリダイレクトしていませんか?それは「PHPリダイレクトハック」の被害かもしれません。PHPリダイレクトハックは、PHPで構築されたサイトに対して最も多く実行されている攻撃手法の一つです。このハックでは、訪問者がアダルトコンテンツや偽ブランド品販売サイトなど、さまざまな悪質なサイトへ強制的に誘導されます。攻撃者の多くは、広告収入やインプレッション数を不正に稼ぐことを目的としています。 しかし、こうした悪意あるサイトの多くは、あなたのユーザーにも深刻な被害をもたらします。フィッシングによって個人情報や機密情報を盗まれたり、有害な広告をク