Shikata Ga Nai

Private? There is no such things.

HTTP Hostヘッダー攻撃とは? その危険性と仕組みを徹底解説!

Hello there, ('ω')ノ

💡 Hostヘッダーとは?

HTTPリクエストに含まれる Host ヘッダーは、アクセス先のドメイン名(ホスト名)をサーバに伝えるための情報です。

例:

GET /support HTTP/1.1
Host: example.com

⚠️ Hostヘッダー攻撃とは?

Hostヘッダー攻撃(Host Header Injection)は、ユーザーが自由に書き換えられるHostヘッダーを悪用し、サーバ側の処理を不正に操作する攻撃手法です。

Webアプリケーションがこの値を信頼しすぎてしまうことが主な原因です。


🧪 なぜ危険なのか?

開発者が「このサーバは Host: example.com で動作するだろう」と思っていても、実際にはユーザーが任意の値を送信可能です。

例えば、パスワード再設定メールのリンクを次のように生成していたらどうなるでしょうか?

<a href="https://<?=$_SERVER['HOST']?>/reset?token=abc">パスワードをリセット</a>

このとき、攻撃者が以下のように細工したHostヘッダーを送れば…

Host: attacker.com

メールリンクは次のようになります:

https://attacker.com/reset?token=abc

👿 これを受け取った被害者がリンクをクリックすると、トークン付きのリクエストが攻撃者のサイトに送信され、乗っ取り可能になるのです。


🧨 よくある悪用例

攻撃手法 概要
🔁 Webキャッシュポイズニング キャッシュされたページが偽のドメインに基づいて保存され、他のユーザーにも提供されてしまう。
🧠 ビジネスロジックの誤動作 ホスト名によって処理分岐している部分を騙して不正動作を引き起こす。
🌐 SSRF(サーバーサイドリクエストフォージェリ) 内部APIなどへのアクセス経路にHostヘッダーが使われていると、偽装して内部情報を引き出せる。
💥 SQLインジェクション Hostの値がSQL文の一部に使われるケースで、構文を崩して不正な操作が可能になる。

✅ 対策は?

  1. Hostヘッダーに依存しない構成にする。
  2. 必要な場合は、正規のホスト名のみ許可するようにバリデーションを行う。
  3. 再設定URLやメールリンクには固定のドメインを使用する。

Best regards, (^^ゞ