Nuevos labs cada semana — Accede a todos desde 5€/mes

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

Duplicar pagos/transferenciasAplicar cupones múltiples vecesBypassear rate limitingIncrementar likes/votos sin límiteCrear recursos duplicados

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

1

Identificar operaciones check-then-act

Busca código que primero verifica (¿tiene saldo? ¿cupón válido?) y luego actúa (transferir, aplicar descuento).

2

Preparar requests

Configura 10-50 requests idénticos en Burp Repeater (Group Send) o Turbo Intruder.

3

Enviar simultáneamente

Lanza todos los requests a la vez. El objetivo es que lleguen al servidor antes de que se procese el primero.

4

Verificar resultados

¿Se aplicó el cupón 3 veces? ¿Se duplicó la transferencia? ¿Se crearon 2 cuentas con el mismo email?

5

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

$5,000+
1

Identificar operaciones secuenciales

El servidor ejecuta 3 pasos: fsAccess (verificar existe) → isBlocked (verificar no bloqueado) → createReadStream (leer archivo).

2

Cada paso resuelve symlinks independientemente

Entre paso 1 y paso 2, el symlink puede cambiar de destino. 3 resoluciones = 3 oportunidades de race.

3

Manipular symlink vía Git branches

Crear repo con 2 branches: main (symlink→/etc) y second (symlink→/home). Alternar rápidamente entre branches.

4

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

5

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 gratis

Herramientas

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.