WordPressの検索結果を悪用したSEOスパム攻撃|事象まとめと対処

IT
スポンサーリンク

Google Search Consoleで、サイト内に大量の「noindexタグによって除外されました」というURLが並ぶ事象に遭遇しました。調査と検証の結果、サイト内検索(?s=)を悪用したSEOスパム攻撃であることが分かったので、事象の整理と対処方法をまとめます。


事象の概要

何が起きていたか

  • Search Console の「ページのインデックス登録」で、「noindexタグによって除外されました」 に分類されるURLが多数表示された。
  • 特に目立ったのは、非常に長いクエリのURLだった。
    • 例: https://example.com/?s=220-1102-Deutsch+Schulungsangebot+Testing+Engine+CompTIA+... のような、ドイツ語のキーワードや資格名・教材名が詰め込まれた形式。
  • 「前回のクロール」日付が付いており、検索エンジンがそれらのURLにアクセスしてクロールしていた。

第一印象

  • 見覚えのないURLばかりで、不正なページが増殖しているのでは? と不安になった。
  • 一方で、noindex で除外されているため、検索結果には出ていない状態だった。

原因の特定

攻撃の正体:検索結果ページの悪用

調べた結果、これは WordPress の「サイト内検索」の仕様を利用した攻撃でした。

  1. 攻撃者が、https://対象サイト/?s=任意のキーワード という形でリクエストを送る。
  2. WordPress は 検索結果が0件でも、検索結果用のページを表示する(仕様)。
  3. 攻撃者は 大量のキーワード(他言語・資格名・商品名など)で同様のURLを生成し、クローラーに発見させようとする。
  4. 目的は、スパム用の検索結果ページを検索エンジンに登録させること、または サイトの評判・順位を落とすブラックハットSEO とされる。

重要な点として、サイトに侵入(改ざん)していなくても成立する手法です。
参考: Google検索結果に中国語や商品名のワードプレスの検索結果が登録されるSEOハックの新手法(WPドクター)


検証:同じページは本当にできるか

「攻撃者と同じように ?s= でリクエストを送ると、同じようなページが生成されるか」を確認しました。

検証方法

次のようなURLにHTTPリクエストを送り、レスポンスを確認した。

  • 例: https://対象サイト/?s=Test+Schulungsangebot+CompTIA+Trainingsunterlagen+itzert

検証結果

  • HTTP 200 で応答が返った。
  • タイトルは 「“Test Schulungsangebot …” の検索結果」 となり、本文には 「投稿が見つかりませんでした。」 と表示された。
  • つまり、任意の ?s= キーワードに対して、1本の「検索結果ページ」が生成されていることが確認できた。

このことから、攻撃者と同じ手順で、同じ種類のページが量産可能であることが分かりました。


補足:ファイルは生成されないのに、なぜSEOに悪影響があるのか

検証で「?s=… でリクエストすると 200 でページが返る」ことを確認しましたが、サーバーに新しいファイルが作られるわけではありません。それでもSEOへの悪影響が起こる理由を整理します。

この操作でファイルは生成されない

?s=Test+Schulungsangebot+... のようにリクエストしたとき、サーバー側では次のような処理が行われます。

  1. Webサーバーがリクエストを受け取り、WordPress(PHP)に渡す。
  2. WordPress が s パラメータを読み、データベースを検索する。
  3. 既存のテンプレート(search.php など)を使って、メモリ上で HTML を組み立てる。
  4. その HTML をレスポンスとして返す(200)。

この一連の流れで ディスクに新しいファイルを保存する処理はありません
「リクエストのたびに、その場で HTML を組み立てて返しているだけ」なので、ファイルは増えません

それでもSEOへの悪影響が起こる理由

「ページ」は 「そのURLにアクセスしたときに返ってくる内容」 として存在します。
ファイルが新規にできなくても、URL そのものが検索エンジンにクロール・インデックスされることで悪影響が出ます。

段階 起きること
攻撃者が https://対象サイト/?s=スパムキーワードA のような URL を大量に用意し、リンクや送信で検索エンジンに知らせる。
検索エンジンのクローラーが その URL にアクセスする。
サーバーは その都度 検索結果ページの HTML を生成し、200 で返す(ファイルは作らない)。
クローラーは「この URL にはこういう内容のページがある」と認識し、インデックスに登録しようとする(noindex がなければ)。
結果として「質の低い・スパムっぽい URL」が大量にインデックスされ、サイト全体の評価が下がる、あるいは スパムキーワードとサイトが結びつく

つまり、**害が発生するのは「ファイル」ではなく「URL がインデックスされること」**です。
同じ search.php が、リクエストごとに異なる URL・異なる内容を返しているだけであり、その「無数にある URL」がインデックスされることで、SEO 上の悪影響が生じます。

たとえで言うと

  • ファイル = 本の原稿が1冊だけある状態。
  • URL = その原稿を、「〇〇という書名で出します」と申し込まれるたびに、その場で表紙だけ変えて渡している状態。
  • 検索エンジンは「書名(URL)ごとに別の本がある」と認識し、質の低い書名が増えると「この出版社(サイト)は質が低い」と判断する。

原稿ファイルが増えなくても、**「存在するように見えるページ(URL)が増える」**ことで悪影響が出る、というイメージです。

そのため、検索結果ページに noindex を付けて、これらの URL をインデックス対象にしないことが、有効な対策になります。


Search Console から見た結論:noindex が効いていれば問題ない

Search Console の画面で、該当URLが 「noindexタグによって除外されました」 と表示されている場合、次のように整理できます。

結論:インデックス面では問題は抑えられている

  • そのURLは クロールはされているが、インデックス(検索結果への掲載)はされていない 状態です。
  • つまり、スパムURLが検索結果に載ってサイト評価を下げる事態にはなっていないと考えてよいです。
  • 「noindex がかかっているから、現時点のインデックス被害は起きていない」 と判断して問題ありません。

確認しておきたいこと

「問題ない」を「何も対策しなくてよい」と捉えるかどうかは、次の確認があると安心です。

確認したいこと 理由
noindex を誰が・何が付けているか テーマの search.php や functions.php、あるいは SEO プラグインで 意図的に noindex を付けているなら、その設定が続く限り安心。たまたま別要因で noindex になっているだけなら、環境変更で変わる可能性がある。
検索結果ページが「すべて」noindex か 一部だけ noindex で、別の検索URLがインデックスされている可能性も(あまり多くはないが)ある。必要なら「サイト:ドメイン」で検索URLがインデックスされていないか確認するとより安心。

まとめ

  • Search Console の意味: 表示されているスパムっぽいURLは noindex で除外されている → 検索結果には出ていない。
  • 結論: noindex が効いているから、インデックスという意味では「問題ない」状態 と見てよい。
  • おすすめ: その noindex が テーマやプラグインで明示的に設定されているか だけ確認し、設定されていなければ、次節のとおり functions.php で検索結果に noindex を付けておくと今後も安心です。

Search Console に表示されると気になるが…

一覧に見覚えのないURLが並ぶと「何かまずいのでは?」と気になるのは自然です。noindex で除外されていれば、表示のされ方さえ理解していれば問題ありません。

なぜ気になるか・何に注意するか

気になる点 実際のところ
見覚えのないURLが並ぶ 攻撃者が ?s=スパムキーワード でアクセスした結果、クローラーがそのURLを拾っているだけ。ファイルが増えているわけではない
数が増え続ける 攻撃が続いていると、新しいURLが一覧に追加され続けることはある。noindex で除外されていれば、検索結果には載らない
完全に消えるか 攻撃が止まらない限り、一覧に新しいURLが追加され続ける可能性はある。それ自体は「攻撃が続いている」という意味であり、noindex が効いている限り、SEO 的には問題ない

しておくと安心なこと

  1. noindex が意図して付いているか確認
    テーマ(search.php / functions.php)か SEO プラグインで、検索結果に noindex が付く設定になっているか確認する。付いていれば、テーマやプラグインを変えたり外したりしなければ、今後も同じように除外され続ける。
  2. 「除外されました」のままか時々確認
    たまに Search Console で、該当URLが 「noindexタグによって除外されました」 のままか見ておく。ずっと「除外されました」なら、表示は気になるが、問題ない状態と判断してよい。

まとめ: Search Console にこうしたURLが出てくること自体は「気になる」で正しいが、noindex で除外されている限り、SEO 上の問題はない。設定を変えず、noindex が付き続けるようにしておけばよい。


対処方法

基本方針:検索結果ページに noindex を付ける

検索結果ページを 検索エンジンにインデックスさせない ようにすることが有効です。
すでに noindex が付いていて「除外されました」と出ている場合は、現状の設定を維持し、未対応の場合は以下を検討してください。

実装例(WordPress)

テーマの functions.php に、検索結果ページのときに noindex を出力する処理を追加する。

検索結果ページ全体を noindex にする場合:

add_action('wp_head', 'noindex_search_result');
function noindex_search_result() {
    if (is_search()) {
        ?>
        <meta name="robots" content="noindex, nofollow" />
        <?php
    }
}

「検索結果が0件のときだけ」noindex にしたい場合:

add_action('wp_head', 'noindex_search_result');
function noindex_search_result() {
    if (is_search()) {
        global $wp_query;
        if (empty($wp_query->found_posts)) {
            ?>
            <meta name="robots" content="noindex, nofollow" />
            <?php
        }
    }
}

※ すでにテーマやSEOプラグインで検索結果に noindex を付与している場合は、重複しないよう確認してください。

あわせて行いたいこと

  • プラグイン・テーマ・WordPressコア を更新し、侵入経路を減らす。
  • マルウェアスキャン脆弱性検査 を行い、改ざんや不正ファイルがないか確認する(今回の手口は「侵入なし」でも成立するが、別の改ざんが潜んでいる可能性はある)。
  • 強めのパスワード二要素認証の利用を検討する。

詳細な調査チェックリストは、別ドキュメント docs/wordpress-attack-investigation.md にまとめてあります。


まとめ

項目 内容
事象 Search Console に、noindex で除外された「長い検索クエリ」のURLが多数表示された
原因 第三者による ?s= を使ったサイト内検索の悪用(SEOスパム/ファーマハック系の手口)
検証 同様の ?s= リクエストで、検索結果0件のページが 200 で返ることを確認した
ファイル この手口では 新規ファイルは生成されない(リクエストのたびにメモリ上でHTMLを返しているだけ)
SEO悪影響 URL がインデックスされることで発生。noindex でインデックスさせないことが対策になる
Search Console 「noindexタグによって除外されました」と出ていれば インデックスはされておらず、現状は問題ない。意図的に noindex が付いているか確認し、未設定なら functions.php 等で付与を推奨
対処 検索結果ページに noindex を付与し、必要に応じてマルウェアスキャン・更新・認証強化を行う

侵入を前提としない手法のため、noindex の付与設定の維持が、今回のような事象の再発防止に有効です。

参考:実際にGoogleサーチコンソールの”noindex タグによって除外されました”に記録されていたURL

コメント

タイトルとURLをコピーしました