LDAP Injection (Inyección LDAP)
🌐 Vulnerabilidad: LDAP Injection
🕵️♂️ ¿Qué es LDAP Injection?
LDAP Injection es una vulnerabilidad que ocurre cuando un atacante manipula consultas LDAP (Lightweight Directory Access Protocol) para alterar la lógica de búsqueda o autenticación. Esto puede dar acceso no autorizado a sistemas, permitir eludir autenticaciones o modificar registros en un servidor LDAP.
⚙️ ¿Cómo se produce?
Entrada de usuario no validada:
Los datos del usuario se incorporan directamente en consultas LDAP.
Manipulación de la consulta:
El atacante introduce caracteres especiales para modificar la lógica de la consulta.
Ejecución del ataque:
El servidor LDAP procesa la consulta modificada y devuelve resultados no esperados.
🛠️ Mecanismo de ataque
Ejemplo de consulta LDAP básica para autenticación:
(&(uid=<USER_INPUT>)(password=<USER_PASSWORD>))
Un atacante puede inyectar en <USER_INPUT>
un payload como:
*)(uid=*)(
Esto transforma la consulta en:
(&(uid=*)(uid=*)(password=<USER_PASSWORD>))
📌 Resultado: El filtro uid=*
coincide con todos los usuarios, permitiendo eludir la autenticación.
🎯 Impacto
Autenticación eludida: Acceso no autorizado a sistemas y datos.
Exposición de datos sensibles: Obtención de información de usuarios o configuraciones.
Modificación no autorizada: Cambios en atributos de usuarios u objetos.
Escalamiento de privilegios: Acceso a cuentas administrativas o de mayor nivel.
📉 Puntaje CVSS v3
Vector de ataque: Red
Complejidad del ataque: Media
Impacto en confidencialidad: Alto
Impacto en integridad: Alto
Impacto en disponibilidad: Medio
Puntaje CVSS v3: 7.0 - 9.0 (Crítico) 🔥
🧑💻 Ejemplo práctico
Código vulnerable en Java:
String filter = "(&(uid=" + username + ")(password=" + password + "))";
DirContext ctx = new InitialDirContext(env);
NamingEnumeration<?> results = ctx.search("ou=users,dc=example,dc=com", filter, null);
Entrada del atacante:
username
=*)(uid=*)
password
= cualquier valor
Consulta generada:
(&(uid=*)(uid=*)(password=any_password))
📌 Esto devuelve todos los usuarios, permitiendo el acceso al atacante.
🛡️ ¿Cómo prevenir LDAP Injection?
1️⃣ Validar y sanitizar entradas
Verifica que las entradas de usuario no contengan caracteres especiales como *
, )
, (
, o \
:
username = username.replaceAll("[*()\\\\]", "");
2️⃣ Uso de consultas parametrizadas
Utiliza APIs LDAP que admitan parámetros seguros para construir consultas:
String filter = "(&(uid=?)(password=?))";
SearchControls controls = new SearchControls();
controls.setReturningAttributes(new String[] { "cn" });
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
ctx.search("ou=users,dc=example,dc=com", filter, new Object[] { username, password }, controls);
3️⃣ Autenticación mediante hash
En lugar de autenticar directamente con LDAP, compara los hashes de contraseñas para evitar consultas sensibles:
String hashedPassword = hash(password);
if (hashedPassword.equals(storedHashedPassword)) {
// Autenticación exitosa
}
4️⃣ Principio de menor privilegio
Configura el servidor LDAP para que las cuentas utilizadas por la aplicación tengan permisos mínimos necesarios.
5️⃣ Registro y monitoreo
Registra y monitorea las consultas LDAP para identificar patrones sospechosos.
6️⃣ Implementar listas blancas
Solo permite atributos y valores que coincidan con un formato predefinido:
if (!username.matches("^[a-zA-Z0-9]+$")) {
throw new IllegalArgumentException("Entrada inválida.");
}
💡 Dato extra: Los ataques de LDAP Injection son más comunes en sistemas que usan servicios de directorio para autenticar usuarios, como Active Directory o OpenLDAP.
🚨 Nota importante: La mitigación no solo requiere validación de entradas, sino también configuración segura del servidor LDAP para limitar accesos y operaciones.
Última actualización
¿Te fue útil?