IDOR y BOLA: qué son, cómo se encuentran y cómo se evitan
Guía en castellano sobre IDOR (BOLA en APIs): qué es, dónde suele aparecer, cómo se busca en bug bounty y cómo se corrige.
Qué es
Un IDOR (Insecure Direct Object Reference) aparece cuando una aplicación te da acceso a un recurso solo porque conoces su identificador. La aplicación comprueba que has iniciado sesión, pero no comprueba que ese pedido, esa factura o ese mensaje sean tuyos. En las APIs se le llama BOLA (Broken Object Level Authorization) y encabeza desde hace años la lista OWASP API Security Top 10.
La idea cabe en una línea: si cambias el número de la petición y recibes los datos de otra persona, hay un IDOR.
- GET /api/facturas/10432 HTTP/1.1
+ GET /api/facturas/10433 HTTP/1.1
Dónde suele aparecer
- Identificadores en la URL (
/pedido/123), en el cuerpo JSON ("user_id": 123) o en parámetros ocultos de formularios. - Acciones de escritura, no solo de lectura: borrar, editar o compartir un recurso ajeno suele ser más grave que verlo.
- Funciones secundarias que se programan con menos cuidado: exportar a PDF, descargar adjuntos, invitaciones, notificaciones o versiones antiguas de la API.
- Aplicaciones móviles, cuyos endpoints a menudo no se revisan tanto como los de la web.
Usar identificadores largos y aleatorios (UUID) no lo arregla: solo lo hace más difícil de explotar. Si el identificador aparece en otra respuesta, en un enlace compartido o en un correo, el fallo sigue ahí.
Cómo se busca
- Crea dos cuentas propias (A y B) en el programa. Nunca pruebes con datos de usuarios reales.
- Recorre la aplicación con la cuenta A y anota todas las peticiones que incluyan un identificador.
- Repite esas peticiones con la sesión de B, sin cambiar el identificador de A.
- Fíjate también en los métodos: a veces
GETestá protegido yPUToDELETEsobre el mismo recurso no. - Prueba a añadir identificadores donde no los hay: algunos endpoints aceptan un
user_idque la aplicación no envía pero el servidor sí lee.
Cómo se evita
- Comprobar la autorización en el servidor, en cada petición y para cada objeto: "¿este recurso pertenece a quien lo pide, o tiene permiso sobre él?".
- Centralizar esa comprobación (por ejemplo, filtrando siempre las consultas por el propietario) en lugar de repetirla a mano en cada endpoint.
- Añadir pruebas automáticas con dos usuarios que intenten acceder a recursos del otro.
Al reportarlo
Demuestra el acceso usando solo tus dos cuentas y explica qué datos o acciones quedan expuestos. El impacto depende de qué se puede leer o modificar, no de que el identificador sea fácil de adivinar.
Casos reales de IDOR / BOLA
Ver los 9 →Discourse: un editor de etiquetas podía modificar etiquetas ocultas usando su ID en las rutas de sinónimos
Los endpoints de sinónimos y de ajustes de etiquetas de Discourse solo comprobaban permisos sobre la etiqueta visible, así que un editor sin acceso podía convertir etiquetas ocultas en sinónimos indicando su ID numérico.
2 min
Secure Custom Fields: fuga sin autenticación de títulos e IDs de entradas en borrador, privadas o pendientes
Los manejadores AJAX públicos de los campos post_object, relationship y page_link de Secure Custom Fields 6.9.2 consultaban entradas con post_status "any", y cualquier visitante anónimo podía listar y buscar contenido no publicado.
3 min
Weblate: IDOR sin autenticación permitía modificar los datos de facturación asociados a un pago
La página de edición de pagos de Weblate no comprobaba ni la sesión ni los permisos: bastaba con conocer el UUID de un pago para cambiar el nombre y la dirección de facturación del cliente.
2 min
Nextcloud Deck: la API de configuración acepta preferencias de tableros ajenos sin comprobar permisos
El endpoint de configuración de Deck guardaba claves del tipo board:<id>:<clave> para cualquier ID de tablero, sin verificar que el usuario tuviera acceso a ese tablero.
2 min
Nextcloud Team Folders: un administrador delegado "solo API" podía darse acceso a cualquier carpeta de equipo
El endpoint que añade grupos a una Team Folder no comprobaba si el administrador delegado podía gestionar esa carpeta concreta. Con IDs secuenciales, se podía asignar un grupo propio a todas las carpetas de la instancia.
4 min
Nextcloud Photos: los álbumes inteligentes compartidos buscaban con las carpetas de origen del visitante, no del dueño
Al abrir un álbum inteligente ajeno, Photos filtraba los ficheros del propietario con la configuración photosSourceFolders del usuario que lo visitaba, lo que podía exponer ficheros de carpetas que el dueño no había elegido.
5 min