¿Qué son los ataques de inyección LDAP y cómo prevenirlos?
Los ataques de inyección de código son algunos de los ataques en línea más comunes y exitosos. Aplicaciones web, aplicaciones móviles, programas de escritorio, API s, bases de datos , servidores web, etc., pueden ser vulnerables a ataques de inyección de código si aceptan entradas del usuario sin la validación adecuada.
Uno de los ataques de inyección de código más comunes es la inyección LDAP, y eso es lo que discutiremos en esta publicación. Veremos qué es LDAP, cómo funciona la inyección LDAP y brindaremos consejos para mitigar este ataque.
¿Qué es LDAP?
LDAP significa Protocolo ligero de acceso a directorios. Es un protocolo de servicio de directorio que se utiliza para buscar listados de directorios dentro de una base de datos LDAP, más comúnmente nombres de usuarios y contraseñas. Como su nombre lo indica, LDAP es muy liviano y, por eso, se escala muy bien y es utilizado por una gran cantidad de organizaciones en la actualidad.
Un directorio LDAP consta de atributos basados en el esquema LDAP. Cada entrada en el esquema/directorio cuenta con un identificador único llamado nombre distinguido (DN). A continuación se muestra un ejemplo de una entrada para el usuario simulado, Johnnyny Theguy.
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Muchas organizaciones utilizan LDAP para inicio de sesión único para proporcionar a los empleados acceso a múltiples aplicaciones dentro de la red corporativa sin necesidad de iniciar sesión en cada aplicación. Pero más allá de simplemente validar las credenciales del usuario, LDAP se utiliza para responder consultas de información y también incluye varios comandos utilizados para administrar las bases de datos LDAP. Y eso tiene sentido, dada la cantidad de información (más allá de solo nombres de usuario y contraseñas) que contienen las bases de datos LDAP, lo que también resalta los peligros de los ataques de inyección LDAP.
consultas LDAP
Las consultas LDAP enviadas al servidor se denominan filtros de búsqueda LDAP y se construyen utilizando notación de prefijo. Una consulta LDAP típica normalmente implica lo siguiente:
- Conexión de sesión : El usuario se conecta al servidor LDAP.
- Pedido : El usuario envía una consulta al servidor (una búsqueda de usuario, por ejemplo).
- Respuesta : El protocolo LDAP consulta el directorio, localiza la información solicitada y se la proporciona al usuario.
- Terminación : El usuario se desconecta del servidor LDAP.
Una vez dentro de la base de datos, los usuarios pueden formular consultas para ejecutar operaciones a través del servidor LDAP. A continuación se muestra una lista de operaciones comunes que la base de datos/servidor LDAP puede realizar:
- Agregar : Se utiliza para agregar nuevos datos a la base de datos.
- Vincular (autenticar) : Se utiliza para autenticación y cifrado.
- Borrar : Se utiliza para eliminar datos de la base de datos.
- Buscar y comparar : La operación de búsqueda se utiliza para buscar y leer entradas.
- Modificar : Utilizado por clientes LDAP para solicitar que el servidor LDAP realice cambios en las entradas existentes
- Desatar : Se utiliza para cerrar la conexión.
Dentro de sus consultas, LDAP admite los siguientes metacaracteres:
- & Booleano Y
- | booleano o
- ! Booleano NO
- = igual
- ~= Aprox.
- >= Mas grande que
- <= Menos que
- * cualquier personaje
- () Paréntesis de agrupación
A continuación se muestran algunos ejemplos de consultas LDAP.
Una solicitud de autenticación de usuario típica (es decir, un inicio de sesión de usuario) se vería así:
|_+_|
Si las credenciales enviadas coinciden con las del servidor LDAP, el usuario Johnny será autenticado.
Otros ejemplos serían:
Encuentre todos los usuarios que necesitan cambiar su contraseña la próxima vez que inicien sesión:
|_+_|
Esta consulta devolvería una lista de todos los usuarios encontrados en la base de datos que tienen el atributo pwdLastSet con el valor: 0.
Encuentre todos los usuarios con 'contraseña' o 'contraseña' en su descripción
|_+_|
Esta consulta devolvería una lista de todos los usuarios encontrados en la base de datos que tienen los atributos de contraseña o contraseña enumerados.
Inyección LDAP
Ahora que entendemos qué es LDAP y cómo funciona, centremos nuestra atención en la inyección LDAP.
Un ataque de inyección LDAP puede ser absolutamente devastador para su organización. Esto se debe a la cantidad de información de alto valor que puede contener una base de datos LDAP. Estamos hablando de nombres, nombres de usuario, contraseñas, direcciones de correo electrónico, números de teléfono, puestos de trabajo, permisos, etc.
Agregue a eso el hecho de que un ataque de inyección LDAP puede significar muchas cosas. En otras palabras, los ataques de inyección LDAP son multivectoriales. Un atacante puede explotar un sistema LDAP inseguro de muchas maneras diferentes. Podrían insertar código malicioso que les permita ver todos los nombres de usuario y contraseñas contenidos en la base de datos. O podrían agregarse como usuario en la base de datos LDAP con permisos de administrador del sistema. Un atacante podría incluso eludir por completo el requisito de nombres de usuario y contraseñas. El quid de un ataque de inyección LDAP es proporcionar al servidor una consulta que engañará al servidor para que valide la consulta como verdadera o válida.
Muchos factores entran en juego para que un ataque de inyección LDAP tenga éxito o fracase: el conocimiento y el nivel de habilidad del atacante, las medidas de seguridad de TI de la organización y la información contenida en la base de datos LDAP, por ejemplo. Pero en cualquier caso, un ataque de inyección LDAP exitoso normalmente será una gran victoria para el atacante y un dolor significativo para la organización comprometida.
Veamos algunos ejemplos de cómo se podría lograr esto.
Ejemplos de ataques de inyección LDAP
Omitir la autenticación con el metacarácter '&'
Tomemos nuestro primer ejemplo de consulta anterior de un inicio de sesión de usuario:
|_+_|
En una base de datos LDAP vulnerable, un actor malintencionado podría eludir por completo el mecanismo de autenticación creando una consulta maliciosa insertando el metacarácter & entre los atributos de usuario y contraseña de la consulta. Se vería así:
|_+_|
Debido a que LDAP solo analiza los dos primeros atributos, la declaración pasa a ser equivalente a:
|_+_|
Si la consulta anterior se ejecutara en una base de datos/servidor LDAP vulnerable, el resultado sería verdadero y nuestro usuario malicioso 'lo que sea' sería autenticado.
Omitir la autenticación con los metacaracteres '*' y '|'
Usemos un ejemplo similar al anterior (“cn” significa nombre común):
|_+_|
Podemos lograr lo mismo que arriba usando * y | metacaracteres. Si configuramos el valor del nombre de usuario en |_+_|, el filtro de búsqueda se convierte en:
|_+_|
Debido a que LDAP solo analiza los dos primeros atributos, la consulta anterior siempre se devuelve como verdadera. Esta consulta permitiría a un atacante eludir el mecanismo de autenticación de LDAP sin una validación de entrada adecuada.
Listar todos los usuarios en la base de datos con '*'
La siguiente consulta es una consulta de búsqueda LDAP.
|_+_|
La notación de filtro de prefijo anterior indica a la consulta que busque un nodo LDAP con el nombre de usuario y la contraseña proporcionados. Sin embargo, si la base de datos LDAP es vulnerable a la inyección LDAP, un atacante podría sustituir el cn y la contraseña en el ejemplo anterior por *, así:
|_+_|
Eso cambiaría el significado previsto de la consulta y la base de datos devolvería una lista de todos los usuarios.
Los riesgos asociados con la inyección LDAP
Los daños que pueden producirse por los ataques de inyección LDAP son similares a los de otros ataques de inyección. Inyectar código en un servidor implica la capacidad de obtener información y modificar información. Por lo tanto, los ataques de inyección LDAP pueden provocar lo siguiente:
Filtración de datos confidenciales
Como vimos en nuestro último ejemplo, es posible manipular las consultas LDAP enviadas a un servidor vulnerable para enumerar información no deseada. En nuestro ejemplo anterior, mostramos cómo una consulta diseñada con fines malintencionados podría hacer que la base de datos genere la lista de todos los usuarios de la base de datos.
Sin embargo, si el servidor es vulnerable a la inyección LDAP, podría manipularse para generar otros datos confidenciales. Las bases de datos LDAP tienden a almacenar más datos que simplemente nombres de usuario y contraseñas, lo que ya sería bastante dañino si se filtrara. Por eso, un atacante podría crear consultas LDAP para obtener información confidencial como direcciones de correo electrónico, números de teléfono e incluso números de seguridad social. Entonces, además de las cuentas comprometidas y el acceso no autorizado a los recursos de la empresa (que puede ser devastador), la inyección LDAP también podría conducir al robo de identidad, ataques dirigidos suplantación de identidad campañas, etc. Desagradable.
Ataques de denegación de servicio
Los ataques de inyección LDAP también pueden conducir a ataques sencillos y muy efectivos. ataques de denegación de servicio (DoS) . Este ataque se puede montar contra la aplicación que interactúa con el servidor de directorio o contra el propio servidor de directorio. Si un atacante puede crear suficientes consultas LDAP maliciosas que requieren mucho tiempo y recursos, podría consumir todos los recursos disponibles para que otras solicitudes no puedan pasar.
Además, supongamos que la aplicación fue diseñada para mantener en la memoria todas las entradas devueltas por una consulta de búsqueda. En ese caso, una consulta destinada a devolver muchas más entradas de las esperadas podría hacer que la aplicación consuma toda la memoria disponible para procesar esa solicitud. El resultado de esto sería que la aplicación falla.
Archivos alterados y corrupción de datos.
Vimos cómo una consulta creada con fines malintencionados podía exponer datos no deseados al atacante. Pero también es posible engañar a la base de datos para que actualice archivos no deseados, ya sea con basura, para dañar el archivo o editando las contraseñas a una establecida por el atacante. Si el atacante puede engañar a la aplicación para que busque las entradas incorrectas, puede engañarla para que actualice las entradas incorrectas, lo que podría causar pérdida o corrupción de datos.
Cómo prevenir ataques de inyección LDAP
Ahora que conoce las amenazas, le presentamos algunas precauciones que puede tomar para evitar ataques de inyección LDAP.
Hacer cumplir la validación de entrada
En otras palabras: no confíe en las aportaciones del usuario. Independientemente del tipo de usuario (autenticado, interno o público), considere que esa entrada no es de confianza. Si es posible, impida que sus aplicaciones copien datos controlables por el usuario en consultas LDAP. Si eso no es posible, asegúrese de validar la entrada del usuario con una lista de cadenas o caracteres permitidos. Y esta validación siempre debe ocurrir en el lado del servidor, incluso si la entrada se validó previamente en el lado del cliente.
Puede utilizar un patrón de expresión regular sólido para validar entradas estructuradas como números de seguridad social, números de teléfono y direcciones de correo electrónico. Las entradas como los nombres de usuario deben validarse con un conjunto de caracteres aprobado que excluya los metacaracteres LDAP. Los personajes que deben bloquearse incluyen ( ) ;, * | & = y espacio en blanco
Escapar de entrada con codificación
Escape de las cadenas de entrada controladas por el usuario para que los caracteres de control en la entrada no cambien el significado previsto del filtro de búsqueda LDAP. Por ejemplo, en una aplicación Java, los metacaracteres de una consulta LDAP se pueden ingresar con barras invertidas como caracteres de escape. De esta manera, las entradas que no son de confianza se agregan a una consulta de búsqueda como valores de cadena literales, no como predicados LDAP.
También se recomienda encarecidamente utilizar bibliotecas existentes para escapar; no escriba las suyas propias, ya que corre el riesgo de introducir vulnerabilidades no deseadas.
Implementar el principio de privilegio mínimo.
El principio de privilegio mínimo es una política de seguridad de TI que establece que solo se deben asignar los derechos mínimos necesarios a un usuario que requiere acceso a un recurso. Esos derechos también deberían estar vigentes durante el menor tiempo posible. Específicamente, la cuenta LDAP utilizada para vincular el directorio en una aplicación debería tener acceso restringido. Sólo se deben ejecutar consultas LDAP autorizadas en el servidor LDAP.
Envolver
Estos son los entresijos de los ataques de inyección LDAP. Son bastante desagradables y, como muchos (si no la mayoría) de los ataques en línea, sus consecuencias podrían ser catastróficas. Como suele ser el caso con este tipo de ataques, desinfectar la entrada del usuario es la medida de mitigación más importante en este caso. No desinfectar las entradas de sus usuarios es como tener la puerta de entrada de su casa abierta: cualquiera puede simplemente girar la perilla y entrar. Eso no es lo que desea con una aplicación/servidor web. Con suerte, los consejos descritos anteriormente le ayudarán a evitar esa situación.
Como siempre, mantente a salvo.