Nuevos labs cada semana — Accede a todos desde 5€/mes
Ver labs →Race Conditions
Explotar condiciones de carrera en operaciones concurrentes
Respuesta rápida
¿Qué es Race Conditions?
Las race conditions ocurren cuando la aplicación no maneja correctamente operaciones concurrentes. Permiten duplicar acciones, bypassear límites, manipular estados intermedios o explotar la ventana temporal entre verificación y uso.
Severidad
Alto
Frecuencia
Menos común
Payloads
7
Pasos
5
Severidad
Alto
Frecuencia
Menos común
Payloads
7
El patrón TOCTOU (Time-of-Check-Time-of-Use) es el más peligroso: la app verifica una condición, pero en el tiempo entre la verificación y la acción, el estado cambia. Esto se explota enviando múltiples requests simultáneos para 'ganar la carrera'.
Dónde buscar
Códigos de descuento
Aplicar el mismo cupón antes de que se marque como usado. El target clásico de race condition.
Transferencias de dinero
Enviar dos transferencias simultáneas con el mismo saldo — posible double-spending.
Likes y votos
Incrementar contadores sin límite enviando requests concurrentes.
Creación con unicidad
Crear dos recursos que deberían ser únicos (ej: mismo username) enviando requests simultáneos.
Procesamiento de pagos
Añadir items al carrito durante el procesamiento del pago — pagar menos de lo que recibes.
Metodología
Identificar operaciones check-then-act
Busca código que primero verifica (¿tiene saldo? ¿cupón válido?) y luego actúa (transferir, aplicar descuento).
Preparar requests
Configura 10-50 requests idénticos en Burp Repeater (Group Send) o Turbo Intruder.
Enviar simultáneamente
Lanza todos los requests a la vez. El objetivo es que lleguen al servidor antes de que se procese el primero.
Verificar resultados
¿Se aplicó el cupón 3 veces? ¿Se duplicó la transferencia? ¿Se crearon 2 cuentas con el mismo email?
HTTP/2 single-packet attack
HTTP/2 permite enviar múltiples requests en un solo paquete TCP — elimina la variación de red.
Caso real
Race Condition TOCTOU con symlinks → Lectura de archivos del servidor → ATO
Identificar operaciones secuenciales
El servidor ejecuta 3 pasos: fsAccess (verificar existe) → isBlocked (verificar no bloqueado) → createReadStream (leer archivo).
Cada paso resuelve symlinks independientemente
Entre paso 1 y paso 2, el symlink puede cambiar de destino. 3 resoluciones = 3 oportunidades de race.
Manipular symlink vía Git branches
Crear repo con 2 branches: main (symlink→/etc) y second (symlink→/home). Alternar rápidamente entre branches.
Ganar la carrera
En ~10-20 iteraciones, el timing alinea: paso 1 resuelve a /home (permitido), paso 3 resuelve a /etc (bloqueado pero ya pasó el check).
Escalar a ATO
Leer database.sqlite → extraer hashes. Leer config → extraer encryptionKey → derivar JWT secret → forjar JWT de admin.
Lección: Las operaciones con archivos que resuelven symlinks en pasos separados son vulnerables a TOCTOU. Git branches permiten cambiar el destino del symlink de forma controlada.
Payloads
Burp Group Send
Repeater → Seleccionar 20 tabs → Click derecho → Send group (parallel)
Python threading
import threading\nfor _ in range(20): threading.Thread(target=send_request).start()
curl parallel
seq 20 | xargs -P 20 -I {} curl -X POST https://target.com/api/apply-coupon -d 'code=SAVE50'Payloads avanzados(requiere cuenta)
Turbo Intruder — race
def queueRequests(target, wordlists):\n for i in range(50):\n engine.queue(target.req, gate='race')\n engine.openGate('race')HTTP/2 single-packet
Enviar 50 requests en un solo paquete TCP — requiere HTTP/2 + herramienta compatible
Asyncio race
import asyncio, aiohttp\nasync def race():\n async with aiohttp.ClientSession() as s:\n tasks = [s.post(url, data=payload) for _ in range(50)]\n await asyncio.gather(*tasks)
Double-spending
Enviar 2 transferencias simultáneas: {from: A, to: B, amount: 100} + {from: A, to: C, amount: 100} (saldo = 100)Contenido exclusivo
Crea tu cuenta gratis para acceder a payloads avanzados, scripts y técnicas de bypass
Crear cuenta gratisHerramientas
Turbo Intruder (Burp)
Extension de Burp para enviar requests a velocidad extrema con gating.
Burp → Extensions → Turbo Intruder → race.py template
race-the-web
Herramienta dedicada para testing de race conditions.
race-the-web config.toml
Tips
Cupones = target #1
Envía 10 requests aplicando el mismo cupón — si se aplica más de una vez, es race condition.
Busca check-then-act
Código que primero verifica y luego actúa sin bloqueo atómico es vulnerable.
HTTP/2 elimina variación de red
Con HTTP/2, todos los requests viajan en el mismo paquete TCP — timing perfecto.
Practica Race Conditions con labs reales
Aplica estas técnicas en entornos seguros basados en reportes reales de bug bounty.