WordPressで考える─メールアドレスの解釈のズレでドメイン制限が突破される仕組み

※本記事にはプロモーションが含まれています。

今回は、Web Security Academy「Bypassing access controls using email address parsing discrepancies」というラボを解説します。

このラボでは、メールアドレスの見え方の違いを利用して、本来は登録できないはずのユーザーが入り込めてしまう問題を扱っています。

一見すると「特定のドメインのメールだけ登録OK」という仕組みは安全そうに見えます。
しかし内部の処理にズレがあると、見た目だけ条件を満たしている状態で突破されてしまいます。

WordPressでも、会員登録や限定サイトでよく使われる仕組みなので注意が必要です。

ラボの概要─ドメイン制限があるのに突破される仕組み

このラボでは、登録時に「ginandjuice.shopのメールアドレスだけOK」という制限があります。

通常であれば、外部のメールアドレスでは登録できません。

しかし、メールアドレスの一部を特殊な形式にすると、

  • 登録チェックでは許可されたドメインに見える
  • 実際のメールは別の場所に届く

という状態が作れてしまいます。

その結果、攻撃者が自分で確認メールを受け取り、アカウントを有効化できてしまいます。


攻撃の流れ─なぜ外部ユーザーが登録できてしまうのか

この問題は、処理ごとにメールアドレスの見え方が違うことで起きます。

【攻撃の流れ】

特殊なメールアドレスで登録

サイトは「許可されたドメイン」と判断

確認メールを送信

実際は攻撃者のメールに届く

攻撃者が登録を完了

本来入れない機能にアクセスできる

このように、チェックと実際の動きが一致していないことが原因です。

実際に使われているメールアドレスの例

このラボでは、「特殊なメールアドレス」として、次のような形式が使われています。

=?utf-7?q?attacker&AEA-exploit-server&ACA-?=@ginandjuice.shop

見慣れない形ですが、ポイントはシンプルです。

  • 見た目では「@ginandjuice.shop」が含まれている
  • しかし実際の宛先は別のメールアドレスとして解釈される

つまり、サイトのチェックは通るのに、メールは攻撃者に届く状態が作られています。

一見すると普通のメールアドレスには見えないため、このような入力が通るとは想像しにくいポイントです。


なぜ起きるのか|メールアドレスの解釈のズレ

メールアドレスの見え方がズレる仕組み

入力されたメールアドレス
=?utf-7?…?=@ginandjuice.shop

登録チェックの処理
@ginandjuice.shopがある → OK

メール送信の処理
実際の宛先は attacker@exploit-server

攻撃者にメールが届く

原因はシンプルです。

同じメールアドレスでも、処理によって違う意味で解釈されていることです。

例えば、

  • 登録チェックでは文字列としてそのまま判定する
  • メール送信では別のルールで解釈する

このようにズレがあると、見た目は正しいのに、実際は別の宛先として扱われる状態になります。

今回のラボでは、文字を別の形で表現する仕組みを使って、このズレを引き起こしています。


ラボ名「email address parsing discrepancies」の意味

このラボ名は、次のような意味です。

「メールアドレスの読み取り方の違いを利用して、アクセス制限を回避する」

つまり、

  • 見た目は正しいメールアドレス
  • しかし内部では別の意味として扱われる

という状態を作る攻撃です。


なぜこれはビジネスロジック脆弱性なのか

この問題は、危険な文字を入力したことが原因ではありません。

問題は、「誰を登録させるか」というルールが壊れていることです。

本来は、特定ドメインのユーザーだけ登録できるはずなのに、外部のユーザーでも登録できてしまう状態になっています。

つまり、サイトのルールが守られていないため、ビジネスロジックの問題になります。


WordPressの会員サイトで起きるとどうなるか

WordPressでも現実的に起きるパターンです。

例えば、

  • 社員だけ登録できる会員サイト
  • 学校ドメイン限定のコミュニティ
  • 法人向けのWooCommerceサイト

などです。

ここで、「@company.co.jp のメールだけ登録OK」という仕組みを作ったとします。

しかし実装が甘いと、次のようなことが起きます。

【WordPress会員登録で起きる問題の流れ】

外部ユーザーが特殊なメールで登録

フォームでは会社のメールと判断される

確認メールは攻撃者に届く

登録が完了する

限定ページにアクセスできる

この結果、

  • 社員限定ページが見られる
  • 管理機能に近い操作ができる
  • 法人向け価格が表示される

といった問題につながります。

よくある原因は、メールアドレスの末尾が一致していればOKとしていることです。

このような単純な判定は突破される可能性があります。

例えば、設定ミスや公開してはいけないファイルを狙ったアクセスもよく見られます。

.git/config を狙った攻撃の実例と対策はこちら


WordPressでの対策|メールアドレス判定の注意点

対策のポイントは次の通りです。

まず重要なのは、メールアドレスを見た目だけで判断しないことです。

次に、

  • 登録チェックとメール送信で同じルールを使う
  • メールアドレス確認だけで強い権限を与えない
  • 必要に応じて手動確認を入れる

といった設計にすることが大切です。

また、複数のプラグインを使っている場合は、それぞれの処理が一致しているか確認する必要があります。


設計視点で見ると何が問題だったのか

今回の問題は、同じメールアドレスのはずなのに、別物として扱われていたことです。

本来は、

  • チェックしたメール
  • 送信したメール
  • 保存されたメール

これがすべて一致している必要があります。

しかしズレがあると、確認メールが届いた人と、登録されたユーザーが一致しない状態になります。


設計視点で整理する

1. メールのチェックが見た目だけになっていないか

見た目が同じでも意味が違う場合があります。

2. 登録チェックとメール送信で同じルールを使っているか

ここがズレると問題が起きます。

3. メールアドレス確認だけで安全と判断していないか

確認できたからといって本人とは限りません。

4. プラグインや処理がバラバラに動いていないか

処理の違いがズレを生みます。

5. 特殊な入力でもテストしているか

普通の入力だけでは問題に気づけません。


セキュリティ診断時に確認すべきポイント

  • ドメイン限定の登録機能があるか
  • メールアドレス確認でアカウントが有効化されるか
  • 末尾一致だけで判定していないか
  • 複数のプラグインを組み合わせていないか
  • 確認メールの送信先と登録情報が一致しているか

今回のような問題は、他のビジネスロジック脆弱性でもよく見られます。

仕組みごとに理解しておくと、WordPressの設計ミスにも気づきやすくなります。

ビジネスロジック脆弱性の他の事例はこちら


まとめ

このラボのポイントは、見た目は正しいが中身は別物、というズレです。

このズレがあると、

  • 本来登録できない人が登録できる
  • 限定機能にアクセスできる

といった問題が発生します。

WordPressでも、会員サイトや限定機能では十分起こりうる設計ミスです。

ドメイン制限だけで安心せず、処理の一貫性を確認することが重要です。


よくある疑問

Q1. WordPress本体の問題ですか?

本体ではなく、プラグインや独自実装の組み合わせで起きやすい問題です。

Q2. 末尾が一致していれば安全ですか?

安全ではありません。
見た目だけの判定では不十分です。

Q3. 対策は難しいですか?

難しい技術よりも、設計の考え方が重要です。
同じルールで処理することがポイントです。

Q4. WooCommerceでも起きますか?

法人向けや会員限定の機能では同様の問題が起きる可能性があります。


このブログの運営環境

  • WordPress
  • GeneratePress
  • エックスサーバー

エックスサーバー公式サイト