Introducción rápida a la inyección LDAP
1 de junio de 2023
0 minutos de lecturaEl Protocolo Ligero de Acceso a Directorios (LDAP) es un mecanismo de autenticación para proteger aplicaciones web. LDAP es popular porque es ligero y escala fácilmente: características atractivas para los desarrolladores, pero que también hacen que las bases de datos LDAP almacenen grandes cantidades de información valiosa. Esto las convierte en un objetivo atractivo para los atacantes.
Las aplicaciones construyen consultas LDAP a partir de las entradas de los usuarios para acceder a la información almacenada en las bases de datos LDAP y manipularla. Lo ideal es que la aplicación valide y depure las entradas del usuario. Sin embargo, esto no siempre ocurre, lo que deja estas consultas expuestas a la inyección LDAP.
En este artículo, veremos cómo funciona la inyección LDAP, las posibles consecuencias de este tipo de ataque y las distintas formas de fortalecer las aplicaciones para protegerlas.
Cómo funciona la inyección LDAP
Las consultas LDAP usan predicados construidos con caracteres especiales —como comillas, asteriscos, corchetes y ampersands— para controlar el significado de la consulta. Estos caracteres especiales se llaman metacaracteres. Por lo general, estas entradas se depuran y validan antes de crear y enviar la consulta al servidor. Sin embargo, en un entorno no seguro y sin una validación adecuada de las entradas, un atacante puede modificar los caracteres de control y alterar el comportamiento previsto de la consulta.
Por ejemplo, una página de inicio de sesión solicita un USER y una PASSWORD para autenticar el acceso a una base de datos mediante una de las implementaciones LDAP más extendidas: OpenLDAP. El servidor LDAP usa un filtro de búsqueda como el siguiente para confirmar que las credenciales USER y PASSWORD proporcionadas por el usuario existen en una lista de pares autorizados para acceder:
Es importante señalar que, debido a una particularidad técnica de las funciones de Active Directory Application Mode (ADAM), no podemos dividir esta consulta de búsqueda en dos filtros; es decir, no podemos usar lo siguiente:
OpenLDAP solo procesaría el primer filtro e ignoraría el segundo. Por eso necesitamos el operador AND (&) para asegurarnos de que el filtro de búsqueda devuelva TRUE cuando ingresamos las credenciales correctamente.
Así que, suponiendo que el par de nombre de usuario y contraseña exista en la base de datos, podemos autenticarnos correctamente ingresando “jsmith” y “sec87pD02” como nombre de usuario y contraseña, respectivamente.
Sin embargo, si un atacante solo conoce el nombre de usuario jsmith, podría insertar la siguiente cadena de ataque en el campo USER de la página de inicio de sesión:
Por lo tanto, si no sanitizamos la entrada del usuario antes de insertarla en la consulta de búsqueda LDAP resultante, la consulta se vería así:
En esencia, el atacante completó el primer filtro que procesará el servidor LDAP. Como el primer filtro, que usa el operador &, devuelve TRUE, el script ignora la contraseña incorrecta del segundo filtro y concede acceso a la base de datos.
El filtro de sintaxis LDAP, que consulta el directorio activo, es un objetivo principal para los atacantes. Los actores maliciosos pueden usarlo para pasar valores de cadena que manipulan el servidor LDAP y ejecutan consultas específicas y otras instrucciones LDAP, inyectando comandos que aprovechan permisos inadecuados o configuraciones incorrectas del servidor LDAP. Los permisos mal configurados pueden permitir que un atacante acceda al directorio LDAP y comprometa su estructura de datos principal: el árbol de información del directorio. Los atacantes también pueden modificar las instrucciones LDAP o las aplicaciones web que las crean a partir de las entradas de los usuarios.
Consecuencias de los ataques de inyección LDAP
La inyección LDAP es una brecha de seguridad peligrosa que puede permitir el acceso no autorizado a aplicaciones y recursos, y comprometer la información del directorio. Los atacantes pueden ejecutar ataques LDAP de distintas maneras, cada una con posibles consecuencias graves.
Eludir las medidas de autenticación
Una de las principales razones para usar servicios de directorio es autorizar y autenticar a los usuarios. LDAP controla el acceso de los usuarios a los recursos y las aplicaciones que lo admiten. Para acceder a una aplicación o un recurso, el usuario proporciona sus credenciales de inicio de sesión, como el nombre de usuario y la contraseña, que LDAP compara con los datos del directorio LDAP. Si las credenciales coinciden, el usuario obtiene autorización para acceder al recurso.
Los ataques LDAP suelen intentar eludir las comprobaciones de contraseña. Los actores maliciosos crean una inyección de código que hace que la consulta termine después del nombre de usuario. Esto permite que los atacantes soliciten la autenticación LDAP al servidor sin ingresar la contraseña correcta. Por ejemplo, un atacante puede usar los metacaracteres &, * o | para eludir la autenticación.
Los ataques de inyección LDAP para eludir el inicio de sesión pueden tener consecuencias graves. Los atacantes pueden obtener acceso a cuentas de administrador, lo que expone datos y vulnera la privacidad. En última instancia, estos ataques pueden provocar el compromiso total del sistema, daños a la reputación y pérdidas económicas por demandas, multas y pérdida de negocio.
Datos y recursos expuestos
Una inyección LDAP puede permitir que los atacantes divulguen, modifiquen, inserten o eliminen datos confidenciales —sobre hosts y usuarios— representados en el árbol LDAP. Los ataques de inyección LDAP afectan a las aplicaciones que usan filtros LDAP para proporcionar recursos compartidos.
Un actor malicioso puede inyectar código de filtro LDAP o usar una consulta LDAP para enumerar todos los recursos del directorio. Esto puede comprometer los datos de la empresa, incluida la información confidencial. También puede provocar modificaciones en el directorio, como eliminaciones o adiciones. Una vez que un hacker obtiene información del directorio, puede usar los datos confidenciales como medio de presión en un ataque de ransomware.
Cómo reforzar las aplicaciones contra la inyección LDAP
La mejor forma de evitar los ataques de inyección LDAP es proteger nuestras aplicaciones contra ellos. Al implementar las siguientes prácticas recomendadas, podemos mantener nuestras aplicaciones seguras y reducir la gravedad de cualquier posible ataque de inyección LDAP.
Validar y depurar las entradas de los usuarios
La principal defensa contra los ataques de inyección LDAP es validar y depurar las entradas. Nuestra aplicación debe validar todas las entradas de los usuarios en una consulta LDAP, incluidos los parámetros POST y GET, las cookies y los encabezados HTTP. La aplicación también debe rechazar cualquier entrada que parezca inválida. Si un campo requiere que el usuario proporcione una dirección de correo electrónico, puedes limitar las entradas a puntos (.), letras, números, el símbolo arroba (@), signos más (+), guiones bajos (_) y guiones (-).
En una aplicación cliente-servidor, es obligatorio validar las entradas en el servidor. En el cliente es técnicamente opcional, pero fundamental. La validación del lado del servidor evita que los usuarios eludan la validación del lado del cliente al desactivar JavaScript, lo que permitiría a un atacante filtrar bases de datos y leer o modificar datos. Cuando las aplicaciones no validan las entradas de los usuarios, quedan expuestas a ataques de recorrido de directorios, en los que los atacantes pueden leer archivos arbitrarios en el servidor de una aplicación.
Aplicar el principio de privilegio mínimo y la autorización de confianza cero al acceso a directorios
El principio de privilegio mínimo (PoLP) es una medida de seguridad que limita los derechos de acceso de los usuarios al mínimo necesario para acceder a un recurso durante el menor tiempo posible. El PoLP garantiza que los usuarios solo puedan escribir, ejecutar o leer los recursos que necesitan para cumplir sus funciones y responsabilidades. Esto garantiza la autorización de todas las consultas LDAP que se ejecutan en el servidor LDAP. Para prevenir la inyección LDAP, el PoLP restringe el acceso a la cuenta LDAP que vincula el directorio en una aplicación.
Al reducir los privilegios de las cuentas de vinculación LDAP, podemos limitar el impacto de cualquier ataque de inyección que tenga éxito. Además, con el modelo de confianza cero, también definimos y restringimos el período durante el cual los administradores pueden usar los privilegios elevados. Además de usar contraseñas, considera integrar la autenticación multifactor (MFA) con LDAP. Con MFA, los usuarios de LDAP que inician sesión en una aplicación deben proporcionar una contraseña y un mecanismo de verificación adicional.
Escapar las variables o la sintaxis LDAP
Otro método para prevenir las consultas LDAP es usar funciones proporcionadas por el framework y variables escapadas. Los atacantes pueden aprovechar caracteres como &, *, ! y | para lanzar ataques de inyección LDAP, por lo que podemos depurar las entradas de los usuarios escapando estos caracteres especiales. El RFC 2254 ofrece una guía para escapar valores de aserción en la representación de cadenas de los filtros de búsqueda LDAP.
Cómo prevenir la inyección LDAP
Los atacantes suelen aprovechar las entradas de usuario no validadas para engañar al intérprete de consultas LDAP y hacer que ejecute consultas arbitrarias. Este método altera la estructura prevista de la consulta LDAP y permite que el atacante obtenga acceso no autorizado a información confidencial de los usuarios.
Para prevenir la inyección LDAP, debemos validar y depurar adecuadamente las entradas, usar variables escapadas y aplicar las políticas de PoLP y autorización de confianza cero. Estos métodos ayudan a controlar el acceso a las cuentas de vinculación LDAP y a minimizar el impacto de un ataque de inyección LDAP. Aunque no podemos eliminar todos los posibles ataques de inyección LDAP, sí podemos implementar estas prácticas recomendadas para mantener nuestras aplicaciones y los datos de sus usuarios lo más seguros posible.
