Los ataques de inyección de código son algunos de los ataques en línea más comunes y exitosos. Las aplicaciones web, las aplicaciones móviles, los programas de escritorio, las API, las bases de datos, los servidores web, etc., pueden ser vulnerables a los ataques de inyección de código si aceptan la entrada 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 vamos a discutir en esta publicación. Veremos qué es LDAP, cómo funciona la inyección de LDAP y brindaremos consejos para mitigar este ataque.
Indice
¿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 usuario y contraseñas. Como su nombre lo indica, LDAP es muy liviano y, por eso, 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 se proporciona con un identificador único llamado Nombre Distinguido (DN).
Muchas organizaciones utilizan LDAP para el inicio de sesión único para proporcionar a los empleados acceso a múltiples aplicaciones dentro de la red corporativa sin necesidad de que inicien sesión en cada una de las aplicaciones. Pero más allá de simplemente validar las credenciales de los usuarios, LDAP se usa para responder consultas de información y también incluye varios comandos que se usan para administrar las bases de datos de LDAP. Y eso tiene sentido, dada la cantidad de información (más allá de los nombres de usuario y las contraseñas) que contienen las bases de datos LDAP, lo que también destaca los peligros de los ataques de inyección LDAP.
Consultas LDAP
Las consultas LDAP enviadas al servidor se conocen como filtros de búsqueda LDAP y se construyen utilizando la notación de prefijo. Una consulta LDAP típica suele implicar lo siguiente:
- Conexión de sesión: el usuario se conecta al servidor LDAP.
- Solicitud: 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.
- Finalización: el usuario se desconecta del servidor LDAP.
Una vez dentro de la base de datos, los usuarios pueden formular consultas para ejecutar operaciones sobre el servidor LDAP. A continuación se muestra una lista de operaciones comunes que puede realizar la base de datos/servidor LDAP:
- Agregar: se utiliza para agregar nuevos datos a la base de datos.
- Vincular (autenticar): se utiliza para la autenticación y el cifrado.
- Eliminar: 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 los clientes LDAP para solicitar que el servidor LDAP realice cambios en las entradas existentes
- Desvincular: se utiliza para cerrar la conexión.
Dentro de sus consultas, LDAP admite los siguientes metacaracteres:
- & Booleano Y
- | booleano o
- ! Booleano NO
- = Igual
- ~= Aprox .
- >= Mayor que
- <= Menos que
- * Cualquier personaje
- () Paréntesis de agrupación
Estos son algunos ejemplos de consultas LDAP.
- Una solicitud típica de autenticación de usuario (es decir, un inicio de sesión de usuario). Si las credenciales enviadas coinciden con las del servidor LDAP, se autenticaría al usuario.
- Encuentra 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.
- Encuentra todos los usuarios con ‘pass’ o ‘pwd’ en su descripción. Esta consulta devolvería una lista de todos los usuarios encontrados en la base de datos que tienen los atributos pass o pwd enumerados.
Inyección LDAP
Ahora que entendemos qué es LDAP y cómo funciona, centremos nuestra atención en la inyección de LDAP.
Un ataque de inyección LDAP puede ser absolutamente devastador para tu organización. Eso 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, títulos de trabajo, permisos, etc.
Agrega 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 tienen varios vectores. Un atacante puede explotar un sistema LDAP inseguro de muchas maneras diferentes. Podrían insertar un código malicioso que les permita ver todos los nombres de usuario y contraseñas contenidos en la base de datos. O pueden agregarse como usuario en la base de datos LDAP con permisos de administrador del sistema. Un atacante podría incluso pasar por alto el requisito de nombres de usuario y contraseñas por completo. 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 generalmente será una gran victoria para el atacante y un dolor significativo para la organización comprometida.
Ejemplos
Veamos algunos ejemplos de cómo se podría lograr esto.
Omitir la autenticación con el metacarácter ‘&’
En una base de datos LDAP vulnerable, un actor malicioso podría eludir el mecanismo de autenticación por completo creando una consulta maliciosa insertando el metacarácter & entre el usuario y los atributos de contraseña de la consulta. Eso se vería así:
(&(user=whatever)(&)(password=pass))
Debido a que LDAP solo analiza los dos primeros atributos, la declaración se vuelve equivalente a:
if name = whatever & nothing = nothing
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» se autenticaría.
Omitir la autenticación con ‘*’ y ‘|’ metacaracteres
Usemos un ejemplo similar al anterior («cn» significa nombre común):
(&(cn=Johnny)(password=Johnny’sPassword))
Podemos lograr lo mismo que arriba usando * y | metacaracteres. Si establecemos el valor del nombre de usuario en *)(cn=*))(|(cn=*, el filtro de búsqueda se convierte en:
(&(cn=*)(cn=*))(|(cn=*)(password=pass))
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 la validación de entrada adecuada.
Listado de todos los usuarios en la base de datos con ‘*’
La siguiente consulta es una consulta de búsqueda LDAP.
find(“(&(cn=Johnny)(password=Johnny’sPassword))»)
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 de LDAP, un atacante podría sustituir el cn y la contraseña en el ejemplo anterior con *, así:
find(“(&(cn=*)(password=*))”)
Eso cambiaría el significado previsto de la consulta y la base de datos devolvería una lista de todos los usuarios.
Riesgos asociados con la inyección de LDAP
Los daños que pueden ocurrir por los ataques de inyección LDAP son similares a 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 de LDAP pueden provocar lo siguiente:
Fuga de datos confidenciales
Como vimos con 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 creada con fines malintencionados podría llevar a la base de datos a mostrar la lista de todos los usuarios de la base de datos.
Sin embargo, si el servidor es vulnerable a la inyección de 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, que ya serían lo suficientemente dañinos si se filtraran. 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 (lo que puede ser devastador), la inyección de LDAP también podría conducir al robo de identidad, campañas de phishing dirigidas, etc. Desagradable.
Ataques de denegación de servicio
Los ataques de inyección de LDAP también pueden conducir a ataques de denegación de servicio (DoS) directos y muy efectivos. Este ataque se puede actuar 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 consuman mucho tiempo y recursos, podría consumir todos los recursos disponibles para que otras solicitudes no puedan pasar.
Además, supón que la aplicación fue diseñada para contener todas las entradas devueltas de una consulta de búsqueda en la memoria. En ese caso, una consulta destinada a devolver muchas más entradas de las esperadas podría hacer que la aplicación consuma toda su memoria disponible para procesar esa solicitud. El resultado de eso 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 provocar la pérdida o corrupción de datos.
Cómo prevenir ataques de inyección LDAP
Ahora que conoces las amenazas, aquí hay algunas precauciones que puedes tomar para prevenir ataques de inyección LDAP.
Hacer cumplir la validación de entrada
En otras palabras: no confíes en la entrada del usuario. Independientemente del tipo de usuario (autenticado, interno o público), considera esa entrada como no confiable. Si es posible, impide que tus aplicaciones copien datos controlables por el usuario en consultas LDAP. Si eso no es factible, asegúrate 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.
Puedes usar 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 caracteres que deben bloquearse incluyen (); , * | & = y espacio en blanco
Entrada de escape con codificación
Escapa 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 las bibliotecas existentes para escapar; no escribas las tuyas propias, ya que corres 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 deben estar en vigor durante el menor tiempo posible. Específicamente, la cuenta LDAP utilizada para vincular el directorio en una aplicación debe tener acceso restringido. Solo las consultas LDAP autorizadas deben ejecutarse en el servidor LDAP.
Conclusión
Esos 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 pueden ser catastróficas. Como suele ser el caso con este tipo de ataques, la desinfección de la entrada del usuario es la medida de mitigación más importante aquí. No desinfectar la entrada de tus usuarios es como tener la puerta principal de tu casa abierta: cualquiera puede simplemente girar la manilla y entrar. Eso no es lo que quiere con una aplicación/servidor web. Con suerte, los consejos descritos anteriormente te ayudarán a evitar ese escenario.
Como siempre, mantente a salvo.