Nivel IntermedioGratis

Acortador de URL como PII leak masivo — extracción de ~300 personas/hora

Códigos de baja entropía + sin rate limiting + ticket sin auth = enumeración de teléfonos, tarjetas (BIN+últimos 4) y compras de clientes reales.

Gorka El Bochi9 de mayo de 202611 min

Deja de leer sobre bugs y empieza a cazarlos

Sin tarjeta · Academy gratis · cancela cuando quieras

Crear cuenta gratis

Respuesta rápida

Un acortador de URLs corporativo, usado para enviar tickets de compra por SMS, tenía tres problemas que juntos se vuelven críticos: códigos de 6 caracteres con baja entropía, sin rate limiting, y página de destino sin autenticación. Un solo equipo a 15 req/s extraía PII (teléfono, BIN+últimos 4 de tarjeta, productos comprados) de ~300 personas por hora.


La cadena de fallos

Tres problemas independientes que al combinarse se vuelven críticos:

csharp
[Códigos 6 chars baja entropía]
        ↓
[Sin rate limiting en el acortador]
        ↓
[Página de ticket sin autenticación]
        ↓
[PII completa expuesta]

Fallo 1 — Códigos de baja entropía

Los códigos del acortador son cadenas de 6 caracteres alfanuméricos. El espacio teórico es grande, pero la densidad de códigos válidos activos en producción es suficientemente alta como para que la enumeración aleatoria devuelva resultados de forma consistente.

Fallo 2 — Sin rate limiting

El acortador no bloquea ni desafía peticiones en volumen desde una sola IP. A 15 req/s el servidor responde con normalidad. Sin CAPTCHA, sin throttling, sin 429. La enumeración puede correr indefinidamente.

Fallo 3 — Tickets sin autenticación (el fallo principal)

Las páginas de ticket destino muestran toda la información del cliente sin pedir ninguna verificación. Cualquiera con el enlace ve lo mismo que el cliente legítimo:

  • Número de teléfono completo.
  • Fecha y tienda física donde se realizó la compra.
  • Lista de productos con precios.
  • Importe total.
  • Número parcial de tarjeta — BIN + últimos 4 dígitos (435785******0916).
  • Código QR del ticket.

Cómo funciona el ataque

r
Generar código aleatorio de 6 chars
        ↓
GET acortador/{código}  (sin seguir redirección)
        ↓
¿HTTP 301/302/307?
   No  →  intentar otro código
   Sí  →  código válido
        ↓
Extraer header Location → URL del ticket con teléfono en base64
        ↓
Decodificar base64  →  teléfono obtenido sin cargar la página
        ↓
Cargar página del ticket (sin autenticación)
        ↓
PII completa expuesta

El teléfono viaja codificado en base64 directamente en la URL de redirección:

ini
Location: https://target.tld/user-identification.html?phone=NjM0XXXXXXXX==&...

Esto significa que ni siquiera hace falta cargar la página del ticket para obtener el número de teléfono. Basta con leer el header Location.

El PoC, en una línea:

bash
python3 bruteforce.py -r 15 -o hits.txt

Impacto

Smishing de alta credibilidad. El atacante conoce el teléfono, qué compró, en qué tienda y cuándo. Un SMS con esos datos exactos supera sin problemas los filtros cognitivos de cualquier víctima.

Fraude bancario. BIN + últimos 4 dígitos es suficiente para superar verificaciones de identidad básicas en muchas entidades si el atacante llama haciéndose pasar por el cliente.

Perfilado masivo. Correlacionando tickets por teléfono se construyen historiales de compra detallados de individuos concretos.

RGPD. Teléfonos, datos de tarjeta e historial de compras de clientes en la UE sin ninguna protección. Brecha notificable bajo el artículo 33.


Qué buscar en targets similares

Los acortadores corporativos son un vector que se suele ignorar. Cuando encuentres uno:

  • ¿Cuántos caracteres tiene el código? ¿Qué alfabeto usa?
  • ¿Hay rate limiting en el endpoint de resolución?
  • ¿La URL de destino contiene parámetros sensibles? ¿Están en base64 (que no es cifrado)?
  • ¿La página destino requiere autenticación o es accesible directamente?
  • ¿Los enlaces tienen expiración?

El patrón acortador + página sensible sin auth aparece con frecuencia en sistemas de notificaciones transaccionales: tickets, facturas, confirmaciones de pedido, citas médicas.


Fix

PuntoSolución
Páginas de ticketVerificación de identidad antes de mostrar datos (OTP, últimos dígitos del teléfono)
AcortadorRate limiting + detección de enumeración
Códigos cortosMayor entropía + expiración de enlaces
PII en URLNo exponer datos sensibles en parámetros de URL, ni en base64

Labs relacionados

Practica enumeración de short links y caza de páginas sensibles sin auth: labs de Information Disclosure.

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

Information Disclosure

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.