Laboratory journal. This note traces method, data flow, and mitigation. It does not include exploit instructions, payloads, or reproduction against live systems.
01
Executive Summary
SSRF is a confused-deputy problem: the server fetches a URL the client influenced. The journal studies parsers, redirect policy, and reachability — not a list of bypass hostnames.
Impact is whatever that fetch can touch: cloud metadata, internal admin ports, or file handlers. We document classes, not targeting recipes.
02
Vulnerability
The vulnerability is allowing a caller to choose the authority of a server-side request without a policy that matches the trust boundary.
03
Affected Software
Link unfurling, webhook testers, PDF renderers, import-from-URL features, avatar fetchers, and AI tools that retrieve user-supplied links for RAG.
04
Attack Surface
Any parameter named url, href, callback, webhook, icon, or source that leaves the process. Hidden surfaces: Open Graph fetchers and document converters that resolve images.
05
Root Cause
The failed assumption is “a URL is a string we can allowlist with startsWith(https).” Parsers disagree about scheme, userinfo, redirects, DNS rebinding, and alternate IP notations. Root cause is policy applied to the wrong parse stage.
06
Data Flow
The research object is the parser pipeline, not the final HTTP client call alone.
- → Caller-influenced URL string
- ↓ Parser (scheme, host, port)
- ↓ Policy check (often too early)
- ↓ Redirect / DNS resolution
- ↓ Server-side fetch
- ↓ Internal or privileged destination
07
Why It Becomes RCE
SSRF is usually reachability and information disclosure. It becomes a step toward RCE only when the fetched resource is then deserialized, rendered in a native parser, or delivered to an admin execution feature. Say “SSRF” until that hop is proven.
08
Patch Analysis
Mature patches check the URL after redirects and after resolution, deny link-local and metadata ranges in the running environment, and pin allowed hosts. Patches that only block a hostname string are incomplete — record that as a residual-risk note, validated privately.
09
Detection
Inventory outbound HTTP clients. Require a named policy object next to each one. In production, log destination class (public, private, denied) without logging full secrets from the response.
10
Mitigation
Fetch only from an allowlisted set of hosts, from an isolated network namespace with no metadata and no RFC1918 routes. Disable protocols you do not need. Do not pass fetch results into deserializers or native converters without a second boundary.
11
Lessons Learned
If your note is a list of bypass strings, you wrote an attack guide. If your note names the parse stage that was skipped, you wrote research.
12
References
OWASP, Server-Side Request Forgery — class and defensive controls.
CWE-918 — after the deputy and destination class are identified.
Art of Vector Security disclosure policy — /about/responsible-disclosure.
Continue
- 05 — Authentication → Authorization → Privilege Escalation
CVE to Real Risk
- 07 — API Authorization Vulnerability Research
CVE to Real Risk
- 10 — CVE to Exploitability: Measuring Real-World Risk
CVE to Real Risk