Acceso al panel de administración reescribiendo un 403 en la respuesta
El endpoint de administración devolvía 403 con el listado completo de facturas en el cuerpo. Reescribir el código de estado a 200 bastaba para leerlo.
Resumen
El portal aplicaba la separación entre usuario y administrador solo en el navegador. La vista de administración pedía el listado de facturas al servidor y, ante un 403 Forbidden, mostraba un aviso de permisos insuficientes.
El cuerpo de ese 403 llevaba el listado completo de facturas. El control estaba en el código de estado, no en lo que el servidor decidía enviar.
Detalles técnicos
Comportamiento observado
La petición del listado de facturas devolvía 403, pero con un cuerpo de varios cientos de kilobytes:
GET /api/admin/invoices?company=[REDACTED] HTTP/2
Cookie: [SESIÓN DE USUARIO SIN PRIVILEGIOS]
HTTP/2 403 Forbidden
Content-Type: application/json
Content-Length: 412874
{"error":"forbidden","data":{"invoices":[ ... 3.100 registros ... ]}}Confirmación del fallo
Interceptamos la respuesta y cambiamos solo la línea de estado, sin tocar el cuerpo. La aplicación renderizó el panel completo:
HTTP/2 200 OK # única modificación
Content-Type: application/json
{"error":"forbidden","data":{"invoices":[ ... ]}}
[+] Panel de administración renderizado
[+] Facturación completa visible, incluidas otras empresasAlcance del acceso
El parámetro de empresa tampoco se contrastaba con la sesión. El listado no se limitaba a la organización del usuario autenticado:
GET /api/admin/invoices?company=[OTRO IDENTIFICADOR]
HTTP/2 403 Forbidden -> cuerpo con facturas de una empresa distinta
[!] El identificador de empresa no se contrastaba con la sesiónTrabajamos con dos cuentas facilitadas por el cliente y un identificador de empresa asociado a ellas. No descargamos ni conservamos documentación de terceros. Reportamos el hallazgo el mismo día. Publicamos este análisis anonimizado, con autorización previa del cliente.
Impacto
- Acceso al panel de administración desde una cuenta sin privilegios
- Lectura de la facturación completa de la organización desde esa misma cuenta
- Exposición de datos de otras empresas del portal, al no contrastarse el identificador con la sesión
- Información sensible de negocio: facturación, condiciones contractuales y cartera de clientes
- Exposición regulatoria bajo el RGPD por el tratamiento de datos de facturación de terceros
Remediación
- Autorizar en el servidor, no en el navegador. Si el usuario no tiene permiso, la respuesta no debe contener el recurso, tampoco dentro del cuerpo de un error.
- Devolver cuerpos vacíos en los errores de autorización. Un 403 debe llevar un mensaje genérico y nada más.
- Contrastar todo identificador de la petición con la sesión. Ninguno puede aceptarse tal como llega del navegador.
- Revisar el resto de endpoints administrativos en busca del mismo patrón: el fallo suele estar en una capa compartida.
- Añadir pruebas de autorización a la batería automática, con una cuenta sin privilegios por cada rol.
Referencias
Más análisis
Comprueba si tus endpoints administrativos autorizan en el servidor
Dinos qué activos quieres auditar. Respondemos en menos de 24 horas.