Las vulnerabilidades de lógica de negocio son las que pasan completamente desapercibidas para los escáneres. Sin CVE, sin entrada en exploit-db, sin plantilla de Nuclei. Solo una brecha entre lo que la aplicación pretende hacer y lo que realmente hace cuando la presionas desde un ángulo inesperado.
También son algunos de los hallazgos más valiosos que puedes reportar. Alto impacto en el negocio, difíciles de detectar automáticamente, y con frecuencia llevan años en producción porque nadie pensó en probarlas.
Esta guía cubre cómo encontrarlas, cómo explotarlas y cómo se ven los ataques de lógica de negocio en la práctica.
¿Qué es una Vulnerabilidad de Lógica de Negocio?
Una vulnerabilidad de lógica de negocio es un fallo en el diseño o implementación del flujo de trabajo previsto de una aplicación — no un problema clásico de inyección o corrupción de memoria, sino un caso donde las propias reglas de la aplicación pueden ser abusadas.
Ejemplos clásicos:
- Aplicar un cupón de descuento más de una vez
- Comprar artículos a precios negativos
- Saltarse pasos de pago en un proceso de pago en múltiples etapas
- Retirar más dinero del que tienes en tu saldo
- Acceder a los datos de otro usuario manipulando un ID de pedido
- Eludir límites de velocidad modificando parámetros de solicitud
- Explotar condiciones de carrera durante transacciones concurrentes
Lo que hace que estos fallos sean peligrosos es que la aplicación se comporta exactamente como fue codificada — la lógica en sí misma está rota.
Por Qué los Fallos de Lógica de Negocio se Reportan Poco
Los escáneres automatizados son inútiles aquí. No hay error SQL que detectar, no hay payload de XSS que inyectar, no hay excepción del lado del servidor que capturar. Encontrarlos requiere:
- Entender el flujo de trabajo previsto — tienes que saber lo que la aplicación debería hacer
- Desviación creativa — probar qué ocurre cuando no sigues el camino esperado
- Solicitudes encadenadas — frecuentemente la vulnerabilidad solo aparece a través de múltiples pasos
La mayoría de los pentesters dedican el 90% de su tiempo a ataques de inyección. Los fallos de lógica de negocio se quedan ahí acumulando polvo.
Categorías Comunes de Vulnerabilidades de Lógica de Negocio
1. Manipulación de Precios y Cantidades
La aplicación confía en valores proporcionados por el usuario para precios, cantidades o descuentos.
Ataque:
POST /cart/add HTTP/1.1
Host: tienda.objetivo.com
Content-Type: application/json
{
"item_id": "SKU-4421",
"quantity": -1,
"price": -99.99
}
Si el backend usa el campo price proporcionado por el cliente, acabas de crear crédito en la tienda al añadir un artículo con precio negativo.
Qué probar:
- Cantidades negativas en el carrito
- Precios negativos
- Artículos a precio cero con códigos promocionales
- Desbordamiento de enteros en cantidades (ej.,
quantity=2147483647) - Modificar campos ocultos del formulario como
price,total,discount
2. Abuso de Cupones y Descuentos
La lógica de descuentos es notoriamente defectuosa. Las aplicaciones frecuentemente validan la presencia de un cupón pero no sus restricciones de reutilización.
Patrones de ataque:
- Aplicar el mismo cupón múltiples veces antes de que se complete el pago
- Aplicar múltiples cupones diferentes que no están diseñados para acumularse
- Usar un cupón para una categoría de producto a la que no aplica
- Condición de carrera: enviar el proceso de pago dos veces simultáneamente con el mismo cupón de un solo uso
Enfoque con Burp Suite: Usa el Repeater para repetir las solicitudes de aplicación de cupones en rápida sucesión. Verifica si el descuento se acumula.
POST /promo/apply HTTP/1.1
Host: objetivo.com
code=SAVE50&order_id=8821
Envía 5 solicitudes simultáneas mediante Burp Intruder (payload nulo, 5 iteraciones, hilos concurrentes) y observa si el descuento se aplica múltiples veces.
3. Saltar Pasos del Flujo de Trabajo
Los procesos de múltiples pasos (pago, restablecimiento de contraseña, incorporación) a menudo carecen de validación de estado del lado del servidor. La aplicación asume que completaste el Paso 2 antes del Paso 3, pero no lo verifica.
Ejemplo — bypass de pago:
- Iniciar proceso de pago → obtener ID de pedido
ORD-9921 - Saltar el paso de pago por completo
- Navegar directamente a:
GET /checkout/confirm?order_id=ORD-9921&status=paid
Si la página de confirmación procesa el pedido sin verificar que realmente se cobró el pago, has completado una compra gratuita.
Qué mapear:
Paso 1: /checkout/start → establece order_id
Paso 2: /checkout/payment → llama al procesador de pago
Paso 3: /checkout/confirm → marca el pedido como completado
Prueba saltar directamente del Paso 1 al Paso 3. Si el Paso 3 solo verifica que existe un order_id (no que el pago se realizó), el paso es saltable.
4. Escalada de Cuentas y Privilegios mediante Lógica
No es IDOR (eso es diferente) — aquí se manipula la lógica alrededor de niveles de cuenta, suscripciones o roles.
Ejemplos:
- Registrarse para una prueba gratuita → se envía una solicitud de degradación a
/api/account/downgrade→ interceptarla y enviar parámetros de actualización en su lugar - Comprar el nivel básico → modificar
plan_iddurante la devolución de llamada post-pago - Abuso de referencias: crear cuentas con el mismo correo usando trucos
+etiqueta([email protected],[email protected]) para auto-referirse
Bypass de suscripción:
POST /api/billing/webhook HTTP/1.1
Host: saas-objetivo.com
Content-Type: application/json
{
"event": "subscription.updated",
"plan": "enterprise",
"user_id": "TU_USER_ID",
"status": "active"
}
Si el endpoint del webhook de facturación no está correctamente autenticado (sin verificación de firma), puedes dispararlo tú mismo y actualizar tu propia cuenta.
5. Condiciones de Carrera
Las condiciones de carrera en la lógica de negocio son devastadoras en aplicaciones financieras. El clásico: retirar los mismos fondos dos veces antes de que se actualice el saldo.
La ventana TOCTOU (Time-of-Check to Time-of-Use):
Hilo 1: Verificar saldo ($100) → saldo OK
Hilo 2: Verificar saldo ($100) → saldo OK
Hilo 1: Debitar $100 → saldo = $0
Hilo 2: Debitar $100 → saldo = -$100 (permitido)
Herramientas para pruebas de condiciones de carrera:
Las Solicitudes Paralelas de Burp Suite Pro (añadidas en 2023) están diseñadas específicamente para esto:
- Intercepta la solicitud objetivo (aplicar cupón, transferencia, compra)
- Clic derecho → Send to Repeater
- Duplica la pestaña 5-10 veces
- Usa Send group (parallel) — todas las solicitudes se disparan simultáneamente
Para ataques de paquete único (eliminando el jitter de red):
- Activa “Send group (single-packet attack)” en la configuración de Burp Repeater
- Fuerza que todas las solicitudes HTTP/2 lleguen al servidor en un único segmento TCP
# Prueba manual de condición de carrera con Python
import threading
import requests
url = "https://objetivo.com/api/coupon/apply"
headers = {"Authorization": "Bearer TU_TOKEN", "Content-Type": "application/json"}
payload = {"code": "PROMO50", "order_id": "ORD-1234"}
def aplicar_cupon():
r = requests.post(url, json=payload, headers=headers)
print(r.status_code, r.json())
hilos = [threading.Thread(target=aplicar_cupon) for _ in range(10)]
for h in hilos:
h.start()
for h in hilos:
h.join()
6. Confianza Excesiva en Datos del Lado del Cliente
Las aplicaciones que realizan validación en el lado del cliente (JavaScript) y confían en el resultado del lado del servidor son completamente vulnerables.
Manifestaciones comunes:
- Campos de formulario ocultos con precios, IDs de usuario o indicadores de privilegios
- Claims de JWT que no deberían ser modificables
- Valores de cookies que controlan el nivel de acceso (
admin=false→admin=true) - Tokens de almacenamiento local decodificados del lado del cliente para determinar permisos
Qué buscar:
- Cualquier cuerpo POST que contenga
role,admin,plan,tier,price,discount - Cookies siendo analizadas por la lógica de la aplicación (no solo gestión de sesión)
- JSON Web Tokens donde el claim
roleopermissionsse establece del lado del cliente
7. Validación Insuficiente en Transiciones de Estado
Algunas aplicaciones permiten cambios de estado en ambas direcciones cuando solo se debería permitir una dirección.
Ejemplo — abuso de reembolsos:
- Comprar artículo → obtener
order_id=ORD-5521 - Solicitar reembolso → dinero devuelto, pedido marcado como
refunded - Modificar el estado de vuelta:
PATCH /api/orders/ORD-5521con{"status": "delivered"}
Si la aplicación permite cambios de estado arbitrarios mediante la API y no valida la ruta de transición, ahora tienes un artículo entregado y un reembolso.
Mapeo de máquina de estados:
pendiente → pagado → procesando → enviado → entregado
↗
reembolso_solicitado → reembolsado
Prueba: ¿Puedes transicionar directamente de cualquier estado a cualquier otro? ¿Puedes ir hacia atrás (entregado → pendiente)?
Metodología: Cómo Cazar Fallos de Lógica de Negocio
Paso 1: Mapear Cada Flujo de Trabajo
Antes de probar cualquier cosa, mapea lo que la aplicación pretende hacer:
- Navega la aplicación como un usuario legítimo — haz todo lo que la interfaz te permita
- Captura cada solicitud en Burp Proxy
- Agrupa las solicitudes en flujos de trabajo: registro, pago, restablecimiento de contraseña, funciones de administrador
- Para cada flujo de trabajo, anota la secuencia de solicitudes y los parámetros que intercambian
Paso 2: Identificar Límites de Confianza
Para cada parámetro pregunta: ¿Quién debería controlar este valor?
- Si el servidor debería establecerlo → prueba si el cliente puede sobreescribirlo
- Si se establece una vez y se referencia posteriormente → prueba si puede cambiarse a mitad del flujo
- Si se valida una vez → prueba si se puede omitir la validación manipulando la secuencia
Paso 3: Probar Cada Suposición
Para cada flujo de trabajo, el desarrollador hizo suposiciones. Tu trabajo es violar cada una:
| Suposición del Desarrollador | Tu Prueba |
|---|---|
| Los usuarios completan los pasos en orden | Salta pasos, repite pasos, invierte el orden |
| Las cantidades son positivas | Envía cantidades negativas, cero, fraccionarias |
| Los precios vienen del servidor | Modifica cualquier campo de precio en tránsito |
| Los tokens de un solo uso se usan una vez | Envía el mismo token dos veces simultáneamente |
| Los roles se establecen en el inicio de sesión | Modifica parámetros role/admin en cada solicitud |
| La validación ocurre del lado del servidor | Deshabilita JavaScript, modifica verificaciones del lado del cliente |
Paso 4: Probar Casos Límite
- Límites de enteros: 0, -1, 2147483647 (int max), 2147483648 (desbordamiento), null
- Cadenas vacías versus campos ausentes
- Unicode en campos normalmente ASCII
- Valores extremadamente largos
- Parámetros repetidos (
?id=1&id=2— ¿cuál usa la aplicación?)
Paso 5: Encadenar Hallazgos
Las vulnerabilidades de lógica de negocio frecuentemente solo importan cuando se encadenan:
- IDOR (acceder al pedido de otro usuario) + manipulación de cupón = robo de cupón
- Condición de carrera + cupón = descuento ilimitado
- Salto de flujo + manipulación de precio = compra gratuita
Ejemplos Reales de Ataques de Lógica de Negocio
La Condición de Carrera de Shopify (2022)
Investigadores descubrieron que el endpoint de canje de tarjetas de regalo de Shopify era vulnerable a condiciones de carrera. Enviando solicitudes paralelas, los atacantes podían canjear una sola tarjeta de regalo múltiples veces antes de que el saldo se marcara como cero.
Solución: Implementar bloqueos a nivel de base de datos o transacciones atómicas con control de concurrencia optimista.
Manipulación de Precios Negativos en Booking.com
Las versiones tempranas de las aplicaciones de reserva de viajes (incluyendo importantes OTAs) no validaban que los campos de cantidad permanecieran positivos. Cantidades negativas × precio positivo = total negativo, que a veces se procesaba como un crédito.
Bypass de Autenticación de Dos Factores mediante Salto de Flujo
Una clase bien documentada de fallos en implementaciones 2FA: la aplicación te envía a /dashboard después de /2fa/verify, pero el dashboard solo verifica una cookie de sesión válida (establecida después de la autenticación con contraseña) — no si 2FA fue realmente completado. Navegar directamente a /dashboard omite el paso 2FA por completo.
/login → POST credenciales → cookie de sesión establecida → /2fa → POST código 2FA → /dashboard
↑
Navegar aquí directamente
Configuración de Burp Suite para Pruebas de Lógica de Negocio
Herramientas de Burp Suite Pro para pruebas de lógica de negocio:
Proxy + Logger:
- Habilita todo el registro en Proxy → Options
- Usa el logger de Burp para reproducir flujos completos
Repeater para Pruebas Manuales:
- Clic derecho en cualquier solicitud → Send to Repeater
- Modifica parámetros uno a la vez y observa las diferencias
- Encadena pestañas del Repeater para flujos de trabajo de múltiples pasos
Intruder para Automatización:
- Ataque cluster bomb para pruebas de múltiples parámetros
- Payload nulo para pruebas de condición de carrera (solicitudes concurrentes)
Sequencer:
- Prueba la predictibilidad de tokens (IDs de pedido, IDs de sesión, tokens CSRF)
- IDs predecibles = potencial de IDOR
Extensiones (BApp Store):
- Autorize — pruebas automáticas de escalada de privilegios
- Param Miner — descubrir parámetros ocultos
- Turbo Intruder — solicitudes paralelas de alta velocidad para condiciones de carrera
- Logger++ — registro mejorado con filtros
Entorno de práctica (despliega un VPS en la nube para pruebas aisladas):
- Vultr — $6/mes, desplegado en segundos
- DigitalOcean — droplets gestionados con aplicaciones de un clic
Defensa: Cómo Corregir las Vulnerabilidades de Lógica de Negocio
Entender las defensas te hace un mejor atacante — sabrás dónde están las brechas.
Gestión de Estado del Lado del Servidor
Nunca confíes en el estado proporcionado por el cliente. El servidor debe:
- Mantener el estado del flujo de trabajo en la base de datos, no en campos ocultos o cookies
- Hacer cumplir transiciones de estado válidas:
pendiente → pagado → enviadosolo, no saltos arbitrarios - Validar el estado completo en cada solicitud, no solo el paso actual
Transacciones Atómicas para Operaciones Financieras
# Incorrecto: verificar luego actuar (vulnerable a TOCTOU)
saldo = obtener_saldo(user_id)
if saldo >= monto:
debitar(user_id, monto)
# Correcto: actualización atómica con verificación
resultado = db.execute(
"UPDATE cuentas SET saldo = saldo - ? WHERE user_id = ? AND saldo >= ?",
(monto, user_id, monto)
)
if resultado.rowcount == 0:
raise FondosInsuficientesError()
Validación de Entrada — Todos los Valores, Del Lado del Servidor
- Valida todos los valores numéricos: positivos, dentro de límites, tipo correcto
- Rechaza solicitudes con cantidades o precios fuera de rango
- Nunca aceptes precios del cliente — siempre consúltalos del lado del servidor
- Tokens de un solo uso: márcalos como usados de forma atómica, antes de devolver el éxito
Verificación de Firma de Webhooks
import hmac
import hashlib
def verificar_webhook(cuerpo_payload, firma_header, secreto):
esperado = hmac.new(
secreto.encode(),
cuerpo_payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(esperado, firma_header)
Objetivos de Práctica
La mejor manera de aprender pruebas de lógica de negocio es romper aplicaciones intencionalmente vulnerables:
PortSwigger Web Security Academy — tiene una serie dedicada de laboratorios de Vulnerabilidades de Lógica de Negocio . Gratuito. Esencial.
DVWA (Damn Vulnerable Web Application):
docker run -d -p 80:80 vulnerables/web-dvwa
Juice Shop (OWASP):
docker run -d -p 3000:3000 bkimminich/juice-shop
Accede a Juice Shop en http://localhost:3000 — incluye desafíos de lógica de negocio en su sistema de puntuación.
Para un laboratorio en la nube (en lugar de local):
DigitalOcean te permite desplegar un droplet de $6, instalar una aplicación vulnerable y eliminarlo cuando termines. Aislamiento limpio, sin riesgo para la red doméstica.
Conclusiones Clave
- Las vulnerabilidades de lógica de negocio requieren pruebas manuales — los escáneres no las encontrarán
- Mapea los flujos de trabajo antes de probar: entiende la intención, luego viola las suposiciones
- Enfócate en transiciones de estado, entradas numéricas, flujos de múltiples pasos y operaciones concurrentes
- Las condiciones de carrera en flujos financieros son de severidad crítica — pruébalas con la función de solicitudes paralelas de Burp
- La mejor defensa es la gestión de estado del lado del servidor con operaciones atómicas
Guías Relacionadas
- Guía de Pentesting de Aplicaciones Web 2026
- Guía de Ataques IDOR 2026
- Guía de Ataques SSRF 2026
- Guía de Deserialización Insegura 2026
- Guía de Ataques SSTI 2026
¿Necesitas un informe de pentesting profesional para tu próximo compromiso? CipherWrite ofrece redacción técnica enfocada en seguridad — informes, whitepapers y resúmenes ejecutivos escritos por profesionales.
