Nuevos labs cada semana — Accede a todos desde 5€/mes
Ver labs →Cheatsheet Race Condition
Condiciones de carrera
Referencia rápida
- →Single-packet attack (HTTP/2) es la tecnica mas fiable para race conditions
- →Buscar race conditions en: cupones, transferencias, likes/votes, tokens de un solo uso, rate limits
- →TOCTOU es comun en operaciones de filesystem: check permisos -> leer archivo
- →Para HTTP/1.1, usar last-byte sync de Turbo Intruder como alternativa a single-packet
- →SQLite WAL files pueden contener datos que el .sqlite principal no tiene
TOCTOU (Time-of-Check-Time-of-Use)
File system race (symlink)
1. Crear symlink: pwn -> /etc (directorio prohibido) 2. Alternar symlink entre directorio permitido y prohibido 3. fsAccess() verifica cuando apunta a permitido 4. createReadStream() lee cuando apunta a prohibido
Balance check-then-debit
1. Check balance: GET /api/balance -> $100 2. Enviar 10 requests simultaneas: POST /api/transfer (amount=100) 3. Todas pasan el check antes de que se aplique el debito 4. Resultado: $1000 transferidos con $100 de saldo
Coupon race condition
1. Enviar multiples requests simultaneas: POST /api/apply-coupon 2. El cupon de un solo uso se aplica multiples veces 3. Descuento multiplicado
Single-packet attack (HTTP/2)
ConceptoJames Kettle - PortSwigger Research 2023
# HTTP/2 permite enviar multiples requests en un solo paquete TCP # Todas llegan al servidor al mismo tiempo exacto # Elimina jitter de red = race condition mas fiable
Turbo Intruder - single packet
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=1,
engine=Engine.HTTP2)
for i in range(20):
engine.queue(target.req)
engine.openGate('race1')
def handleResponse(req, interesting):
table.add(req)Last-byte sync (HTTP/1.1)Tecnica de Turbo Intruder para servidores HTTP/1.1
# Para HTTP/1.1 sin soporte de HTTP/2: 1. Enviar todos los requests menos el ultimo byte 2. Enviar todos los ultimos bytes simultaneamente 3. El servidor procesa todos al mismo tiempo
Limite bypass
Rate limit bypass
Enviar 100 requests en single packet para: - Login brute force (bypass de rate limit) - SMS/email flooding - Voting/like manipulation - Invite code generation
One-time use token reuse
1. Interceptar email con token de reset password 2. Enviar 20 requests simultaneas: POST /reset-password (con el token) 3. Al menos una pasa antes de que el token se invalide
2FA bypass
Enviar multiples requests con diferentes codigos 2FA simultaneamente Si no hay bloqueo atomico, uno puede pasar
Escalacion avanzada
TOCTOU + symlinks via GitTecnica real usada en CVE n8n para file read -> ATO
1. Crear repo Git con symlink en dos branches 2. Branch A: symlink -> directorio prohibido 3. Branch B: symlink -> directorio permitido 4. Workflow que alterna branches rapidamente 5. Leer archivo durante la ventana de carrera
JWT forging via race file read
1. Race condition -> leer database.sqlite + config 2. Extraer encryptionKey del config 3. Derivar JWT secret: SHA256(key[::2]) 4. Forjar JWT para cualquier usuario -> ATO
WebSocket race condition
WebSockets son full-duplex -> enviar multiples mensajes simultaneos: - Doble gasto en transferencias - Bypass de rate limit por mensaje - Operaciones no atomicas en estado compartido
Herramientas
Turbo Intruder
Extension de Burp con soporte de single-packet attack y last-byte sync
Burp Suite > Extensions > Turbo Intruder > Send to Turbo Intruder
Repeater (grupos paralelos)
Enviar multiples requests del Repeater en paralelo con un click
Burp Suite > Repeater > Crear grupo > Send group in parallel
race-the-web
Herramienta CLI para testing de race conditions con configuracion TOML
race-the-web config.toml
Contenido relacionado
¿Listo para practicar?
Pon en práctica estos payloads en labs reales basados en reportes de bug bounty.
Ver labs de práctica