sickn33/agentic-awesome-skills/hunt-host-header
Claude Code and agent skill by sickn33/agentic-awesome-skills
- community
Checking that the SKILL.md file is still in the repository.
Hunt Host Header Injection
Install
npx vskill@latest install sickn33/agentic-awesome-skills/hunt-host-headerSKILL.md
⚠️ AUTHORIZED USE ONLYThis skill is for educational purposes or authorized security assessments only.You must have explicit, written permission from the system owner before using this tool.Misuse of this tool is illegal and strictly prohibited.
Mandatory confirmation gateBefore running any command that probes, exploits, changes, persists on, extracts data from, or attempts credential access against a target:1. Ask the user to state the exact target URL, IP, account, or resource.2. Ask the user to confirm written authorization and the permitted scope.3. Show the exact command(s) and explain their expected effect.4. Wait for explicit confirmation in the current conversation.Without that confirmation, remain read-only and provide defensive guidance only. Prefer a sandbox, disposable VM, or controlled lab.
HUNT-HOST-HEADER — Host Header Injection
Grounding / Provenance
This skill is built from the public Host-header attack literature, not invented payloads. Cite the technique source in your report, never a fabricated ID:
- Password-reset poisoning class — the canonical write-up is Skelet's/Detectify-era
"Practical HTTP Host header attacks" (the Django request.get_host() → password-reset-link case). Many frameworks built the reset URL from the request Host with no ALLOWED_HOSTS-style allowlist. Cite the framework + the reflected-Host behaviour you actually observed.
- Web cache poisoning via unkeyed Host / X-Forwarded-Host — PortSwigger Research,
James Kettle, "Practical Web Cache Poisoning" (2018) and "Web Cache Entanglement" (2020). These define unkeyed-input poisoning, which is the mechanism behind X-Forwarded-Host poisoning.
- Routing-based SSRF — PortSwigger Research, "Cracking the lens" / routing-based SSRF
(Host header steers the front-end's upstream selection).
When you write the report, name the exact behaviour you reproduced (reflected header, cache HIT on a fresh key, OOB hit from your Collaborator). Do not copy a CVE or H1 ID you have not verified — a missing citation is always better than a wrong one.
Crown Jewel Targets
Reset-link manipulation has context-dependent severity; an owned-account test alone does not establish takeover of any user. State required victim interaction, token validation and demonstrated scope.
Highest-value chains:
- Password reset poisoning → ATO — server builds the reset link from the request Host;
attacker sets Host: evil.com; the victim's reset email points the token at the attacker → token captured on click → full ATO. Pre-account-takeover variant: even the victim requesting their own reset leaks the token to evil.com.
- Web cache poisoning via unkeyed Host — a CDN/reverse proxy caches a response that reflects
an attacker X-Forwarded-Host into an absolute URL (script src, link, redirect) → poisoned entry served to every later visitor on that cache key → mass XSS/redirect/CSP bypass.
- Routing-based SSRF — the front-end uses the Host header itself to pick the upstream;
Host: 169.254.169.254 (or an internal hostname) makes it forward your request to that target → cloud metadata / internal admin panels.
- Path-override SSRF / ACL bypass — IIS/ASP.NET/Spring honour
X-Original-URL/
X-Rewrite-URL to override the routed path → reach /admin or internal endpoints the edge ACL thought it blocked. (Different layer from routing SSRF — see Phase 3.)
- OAuth/OIDC poisoning — Host drives
redirect_urior the OIDCissuer/ discovery doc →
auth-code or token theft → ATO.
Attack Surface Signals
Dangerous header candidates (unkeyed / trusted inputs):
Step-by-Step Hunting Methodology
Use an owner-approved isolated cache namespace/lab and disposable owned accounts. Before any cache write verify the cache-buster is actually keyed; otherwise stop rather than poison a shared production key. Confirm request limits, expiry/purge and cleanup. Use an approved owned callback domain instead of third-party example domains; minimize/redact token captures and never request real cloud credentials or contact internal services outside explicit scope. A harmless owned callback usually suffices to show routing behavior. OOB DNS alone proves resolution, not HTTP access or credential impact.
Always test against your own registered test account. Never request another user's reset.
Phase 1 — Password Reset Poisoning
Confirm: open the reset email in your own test inbox and read the link host. The token must appear under an attacker-controlled host (evil.com, $TARGET.evil.com, or a Collaborator domain) for this to be a real finding. Use a Burp Collaborator domain as the injected host so that when the victim clicks (or a preview-fetcher fetches), you capture the token out-of-band and have proof — see Validation.
Phase 2 — Web Cache Poisoning via Host / X-Forwarded-Host
Mechanism: this is a reflection bug, not an OOB bug. The injected host must be reflected into the response body (an absolute URL, script src, <link href>, <base href>, redirect Location, or canonical/og:url) and that response must be cached and reusable by another permitted request on the same verified test key. No Collaborator callback is expected from the cache test itself — only later, if a victim's browser loads the poisoned absolute URL.
False-positive killers (mandatory):
- A reflection that only ever appears for your request (because the header is keyed, e.g. in
Vary, or the CDN includes Host in the key) is not poisoning — confirm 2c returns the payload on a request that omits the header.
Age: 0+MISSevery time → no shared cache → no mass impact. Demote to self-only / Low.- Confirm blast radius from a second machine / fresh egress IP / incognito before claiming
"mass". Cache scope is often per-edge / per-cookie / per-geo.
Phase 3 — SSRF via Host Header — TWO DISTINCT MECHANISMS (do not conflate)
These operate at different layers. Test them separately; they do not compose into one request.
(3A) Routing-based SSRF — the Host header selects the upstream. The path goes on the request line, exactly as a normal request, because the metadata service / internal host serves plain HTTP and only sees the request line + headers you forward. X-Original-URL is irrelevant here — the EC2 IMDS ignores it.
(3B) Path-override SSRF / ACL bypass — `X-Original-URL` / `X-Rewrite-URL`. This is an IIS/ASP.NET/Spring-Cloud-Gateway feature where the app overrides the routed path. The real Host stays put; you are bypassing an edge path ACL, not steering an upstream. Keep the real Host.
The old probeHost: 169.254.169.254+X-Original-URL: /latest/meta-data/was wrong: thosetwo headers act at different layers and never compose. Use 3A for metadata, 3B for ACL bypass.
Phase 4 — OAuth / OIDC / SAML Poisoning
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/hunt-host-header/SKILL.md
Popularity
- Repository stars
- 47,054
- Repository forks
- 6,853
- 7-day trend score
- 54
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/sickn33/agentic-awesome-skills/hunt-host-header)