A01:2021 - Broken Access Control
El control de acceso en una web define si un usuario tiene permitido acceder a determinado recurso o realizar determinada acción. Este control puede ocurrir de manera horizontal y vertical:Control de acceso vertical: Un usuario sin privilegios no podría acceder a los recursos de un usuario administrador.Control de acceso horizontal: Un usuario, por ejemplo, en una web bancaria, puede acceder a sus tarjetas y cuentas, pero no a la de los demás usuarios.¿Cómo se pierde este control de acceso?Para que este control funcione correctamente, las medidas de seguridad deben estar bien implementadas, y este no es siempre el caso. Malas configuraciones, versiones vulnerables de software o un mal diseño de la seguridad puede resultar en un control de acceso deficiente, vulnerando así la confidencialidad, integridad y disponibilidad de la información.Al igual que clasificamos el control de acceso en vertical o horizontal, estas vulnerabilidades pueden resultar en un escalado de privilegios vertical o un movimiento horizontal.Escalado de privilegios verticalEl escalado vertical de privilegios ocurre cuando un atacante explota una vulnerabilidad para elevar su nivel de acceso, pasando de un usuario con privilegios bajos (como un usuario estándar) a un rol con más privilegios, como administrador. En otras palabras, se obtiene control sobre funcionalidades o datos que deberían estar reservados solo para usuarios con niveles de acceso superiores, comprometiendo la seguridad de la aplicación. Estos son algunos ejemplos de escalado de privilegios:Acceso no autorizado al panel de administración.Modificación del rol de un usuario de la plataforma.Acceso a funcionalidades de administrador (borrar un usuario, modificar la contraseña de un usuario…).Movimiento horizontalEl movimiento horizontal ocurre cuando un atacante con acceso a una cuenta de usuario del sistema obtiene acceso a otras cuentas de usuario de similares privilegios. Este movimiento horizontal se da tanto si consigue acceder directamente a una cuenta de usuario como si es capaz de acceder a funcionalidades o datos de dicho usuario no privilegiado.A diferencia del movimiento vertical, donde el atacante obtiene mayores permisos dentro del sistema, el movimiento horizontal se enfoca en comprometer otras cuentas no privilegiadas para descubrir nuevos vectores de ataque en la aplicación. Algunos ejemplos de este movimiento horizontal son:Descubrimiento de las credenciales de otro usuario del sistema.Un control de acceso al perfil de usuario basado en un ID predecible.Acceso a archivos propiedad de otros usuarios del sistema.De escalado horizontal a escalado verticalSi bien es cierto que distinguimos estos dos tipos de movimiento, son comunes los casos de movimiento horizontal que derivan en un escalado vertical de privilegios. Esto se da cuando un atacante a través de técnicas de movimiento horizontal logra acceder a un usuario del sistema con privilegios de administración. Por ejemplo, si un atacante cambia el ID de usuario en la URL para acceder al perfil de otro usuario, estaría realizando un movimiento horizontal. Sin embargo, mediante esta técnica termina accediendo a un usuario administrador de la página web.De esta manera observamos que no es tan sencillo discernir entre qué es un escalado de privilegios y qué un movimiento horizontal, dado que no depende tanto de la técnica o ataque realizado, sino en el resultado obtenido una vez realizado dicho ataque.Vulnerabilidades de control de accesoComo hemos explicado en el apartado anterior, debido a la dificultad de clasificar los ataques entre ataques de escalado de privilegios y ataques de movimiento horizontal, en este apartado nos ceñiremos a explicar distintos ataques, como realizarlos y el resultado que se puede obtener.IDOR (Insecure Direct Object Reference)IDOR es una subcategoría de control de acceso, donde se utilizan parámetros modificables por el usuario para acceder a recursos. Un ejemplo sería un botón en el perfil de usuario para descargar el histórico de chats.Este botón realiza una petición a un archivo ejemplo.txt, pero este parámetro es modificable mediante un proxy, por lo que se puede llegar a acceder a los históricos de chats de otros usuarios.En este ejemplo, al intentar descargar el histórico de chats de nuestro usuario, al interceptar la petición con un proxy, vemos que realiza una consulta a un archivo 2.txt. Tras esta petición GET obtenemos la siguiente respuesta:Sin embargo, este parámetro es modificable, por lo que si reemplazamos este 2.txt por 1.txt obtenemos el histórico de chats de otro usuario, en el cuál podemos encontrar su contraseña:Funcionalidad no protegidaEste es un ataque es muy sencillo y requiere de una falta casi absoluta de control de acceso por parte del servidor. Es posible encontrar páginas web donde los recursos de un administrador estén ocultos, pero no protegidos. En ese caso, podemos encontrar estos recursos de distintas maneras:Un método es acceder al archivo robots
El control de acceso en una web define si un usuario tiene permitido acceder a determinado recurso o realizar determinada acción. Este control puede ocurrir de manera horizontal y vertical:
- Control de acceso vertical: Un usuario sin privilegios no podría acceder a los recursos de un usuario administrador.
- Control de acceso horizontal: Un usuario, por ejemplo, en una web bancaria, puede acceder a sus tarjetas y cuentas, pero no a la de los demás usuarios.
¿Cómo se pierde este control de acceso?
Escalado de privilegios vertical
- Acceso no autorizado al panel de administración.
- Modificación del rol de un usuario de la plataforma.
- Acceso a funcionalidades de administrador (borrar un usuario, modificar la contraseña de un usuario…).
Movimiento horizontal
- Descubrimiento de las credenciales de otro usuario del sistema.
- Un control de acceso al perfil de usuario basado en un ID predecible.
- Acceso a archivos propiedad de otros usuarios del sistema.
De escalado horizontal a escalado vertical
Vulnerabilidades de control de acceso
IDOR (Insecure Direct Object Reference)
Funcionalidad no protegida
- Un método es acceder al archivo robots.txt. Este archivo suele estar disponible en la raíz de la página web y contiene información sobre qué recursos y directorios tienen permitido recorrer los bots de Google, Microsoft… Muchas veces podemos encontrarnos con directorios ocultos o de administración bajo la etiqueta Disallow, revelando así la localización de paneles de administración o archivos sensibles:
- Otra fuente para encontrar este tipo de directorios ocultos es el propio código JavaScript. Es común encontrar referencias a archivos y directorios sensibles en funciones de este lenguaje de programación, como observamos en la siguiente imagen:
Control de acceso basado en parámetros
Mala configuración
Discrepancias en la concordancia de URL
Proceso de múltiples pasos sin control de acceso
Control de acceso basado en la cabecera Referer
Ejemplos simples de movimiento horizontal
Remediación
- No confiar únicamente en la ofuscación para el control de acceso.
- A menos que un recurso esté destinado a ser de acceso público, denegar por defecto el acceso a dicho recurso.
- De ser posible, utilizar un único mecanismo de control de acceso para toda la aplicación.
- A nivel de código, declarar el acceso permitido a cada recurso y denegar el acceso por defecto.
- Auditar y probar minuciosamente los controles de acceso para asegurarse de que funcionan según lo previsto.