Nivel AvanzadoPremiumbounty: $1100

OAuth open redirect — backslash bypass de redirect_uri (POE report walkthrough)

Walkthrough del report POE: open redirect via `\` (backslash) en redirect_uri que el parser de POE no normalizaba correctamente. URL-based XSS encadenado para token theft.

Gorka El Bochi11 de mayo de 202612 min

Deja de leer sobre bugs y empieza a cazarlos

Sin tarjeta · Academy gratis · cancela cuando quieras

Crear cuenta gratis

Respuesta rápida

POE (Quora) tenía un validador de redirect_url que comprobaba que empezara por /, no empezara por //, y no contuviera :. Bypass: /\evil.com. El backslash pasa los tres checks porque "no es un slash". Pero los navegadores normalizan \ → / según WHATWG URL spec → resuelve a //evil.com → https://evil.com. Combinado con la cookie p-b ya emitida + un canvas shouldAutoOpen whitelist que confiaba en poe.com como hostname → cadena zero-click. $1,100 H1 #3652197.


1. La validación vulnerable

typescript
// redirectUrlUtils.ts (POE — anonimizado)
function isValidRedirect(redirectUrl: string): boolean {
  return (
    redirectUrl.startsWith("/") &&        // 1: debe ser path relativo
    !redirectUrl.startsWith("//") &&      // 2: bloquea protocol-relative
    !redirectUrl.includes(":")            // 3: bloquea javascript:, https:, etc
  );
}

A primera vista parece OK. El payload /\evil.com lo rompe:

CheckInput /\evil.comResultado
startsWith("/")Sí, empieza por /✅ pasa
!startsWith("//")Es /\, no //✅ pasa
!includes(":")No hay :✅ pasa
ValidadorACEPTA❌

Pero el browser, al ver /\evil.com, lo normaliza según WHATWG URL spec:

bash
/\evil.com  →  //evil.com  →  https://evil.com

Esa normalización ocurre cuando el navegador resuelve la URL final del Location: header o de un window.location = "...". El validador comprueba antes de la normalización; el browser ejecuta después.


2. La URL de ataque

ini
https://poe.com/login?redirect_url=/%5Cevil.com
  • %5C es URL-encoding de \ (backslash).
  • Server decodea → redirect_url = /\evil.com.
  • Validador acepta → embebe en googleOauthState.next_url.
  • Post-OAuth callback → Location: /\evil.com.
  • Browser resuelve → https://evil.com.

3. Flujo de ataque end-to-end

less
[Atacante] envía link: poe.com/login?redirect_url=/%5Cevil.com
                                  ↓
[Víctima] click → poe.com/login (página real)
                                  ↓
[POE] valida redirect_url (pasa) → embebe en googleOauthState
                                  ↓
[Víctima] click "Continue with Google" → autenticación
                                  ↓
[Google] callback con código válido a poe.com
                                  ↓
[POE] lee next_url del estado → emite Location: /\evil.com
                                  ↓
[Browser] normaliza /\ → // → resuelve a https://evil.com
                                  ↓
[Víctima] llega a evil.com con cookie p-b ya emitida en poe.com

Si la víctima ya estaba logueada, el paso OAuth se salta y el redirect ocurre directo.


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

Open Redirect Backslash Bypass

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.