performing-ssrf-vulnerability-exploitation
$
npx mdskill add xalgord/xalgorix/performing-ssrf-vulnerability-exploitationTests for SSRF vulnerabilities by probing cloud metadata and internal services
- Identifies Server-Side Request Forgery risks in web applications
- Uses AWS/GCP/Azure metadata APIs and internal network endpoints
- Detects IMDSv2 token requirements and bypass techniques
- Reports findings with actionable insights for remediation
SKILL.md
.github/skills/performing-ssrf-vulnerability-exploitationView on GitHub ↗
--- name: performing-ssrf-vulnerability-exploitation description: Test for Server-Side Request Forgery vulnerabilities by probing cloud metadata endpoints, internal network services, and protocol handlers through user-controllable URL parameters. Tests AWS/GCP/Azure metadata APIs (169.254.169.254), internal port scanning via HTTP, URL scheme bypass techniques, and DNS rebinding detection. domain: cybersecurity subdomain: security-operations tags: - performing - ssrf - vulnerability - exploitation version: '1.0' author: mahipal license: Apache-2.0 nist_csf: - DE.CM-01 - RS.MA-01 - GV.OV-01 - DE.AE-02 --- ## When to Use - When conducting security assessments that involve performing ssrf vulnerability exploitation - When following incident response procedures for related security events - When performing scheduled security testing or auditing activities - When validating security controls through hands-on testing ## Most Often Missed & How to Confirm - **IMDSv2 needs a token, not just a GET:** on AWS, `GET http://169.254.169.254/latest/meta-data/` returns 401 under IMDSv2 — but SSRF can still win if it can first send `PUT /latest/api/token` with the `X-aws-ec2-metadata-token-ttl-seconds` header. Don't conclude "not vulnerable" from a single 401; test token retrieval. Note IMDSv2's hop-limit=1 blocks proxied/container hops but not same-host SSRF. - **Other clouds use different hosts/headers:** GCP/Azure metadata require a header (`Metadata-Flavor: Google`, `Metadata: true`); a plain fetch returns 403, which looks "safe" but isn't. Test header injection against the right endpoints (`metadata.google.internal`, `169.254.169.254/metadata/instance?api-version=...`). - **gopher:// for non-HTTP pivots:** when only HTTP-ish fetches are allowed, `gopher://127.0.0.1:6379/_<redis-payload>` or `gopher://...:3306` can hit internal Redis/MySQL/SMTP. A blocked `http://` does not mean other schemes are — enumerate `gopher://`, `dict://`, `file://`, `ftp://`. - **Filter bypasses:** allowlist/blocklist checks are defeated by `http://0x7f000001`, `http://127.0.0.1.nip.io`, decimal IPs, `[::1]`, open redirects on a trusted domain, and DNS rebinding (TTL-0 record flipping to 169.254.169.254 after the validation check). - **Confirm a positive signal, don't infer from timing alone:** the gold standard is attributable exfiltrated data — actual IAM creds (`AccessKeyId`/`SecretAccessKey`), a returned metadata document, or an out-of-band callback (Burp Collaborator / your DNS log) proving the server made the request. Blind/time-based deltas are candidates, not confirmation. Don't conclude negative until you've tried token-based IMDSv2, alternate schemes, encoded IPs, and redirect/rebinding. ## Prerequisites - Familiarity with security operations concepts and tools - Access to a test or lab environment for safe execution - Python 3.8+ with required dependencies installed - Appropriate authorization for any testing activities ## Instructions 1. Install dependencies: `pip install requests` 2. Identify URL parameters in the target application that accept URLs or hostnames. 3. Test SSRF payloads: - Cloud metadata: `http://169.254.169.254/latest/meta-data/` - Internal services: `http://127.0.0.1:port/`, `http://10.0.0.1/` - Protocol handlers: `file:///etc/passwd`, `gopher://`, `dict://` - Bypass techniques: IP encoding, DNS rebinding, URL redirects 4. Analyze responses for information disclosure or internal access confirmation. 5. Generate a vulnerability assessment report. ```bash # For authorized penetration testing and lab environments only python scripts/agent.py --target-url https://app.example.com/fetch?url= --output ssrf_report.json ``` ## Examples ### AWS Metadata SSRF ``` GET /fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/ ``` If the response contains AWS credentials (AccessKeyId, SecretAccessKey), SSRF is confirmed with critical impact.