highCWE-90A03:2021

Inyección LDAP

Input del usuario insertado en filtros de búsqueda LDAP sin escapar, permitiendo a atacantes manipular queries de directorio, bypassear autenticación o extraer datos sensibles del directorio.

Cómo Funciona

Los filtros LDAP usan caracteres especiales como `*`, `(`, `)`, `\` y `NUL`. Si construyes un string de filtro concatenando input del usuario, un atacante puede inyectar estos caracteres para alterar la query. Un bypass de login se ve así: username = `*)(uid=*))(|(uid=*` que convierte una búsqueda específica en 'coincide con todo'.

Código Vulnerable
// MAL: input del usuario directo en el filtro LDAP
const filter = `(uid=${username})`; // username = '*)(uid=*))(|(uid=*'
const result = await ldapClient.search('dc=ejemplo,dc=com', { filter });
Código Seguro
// BIEN: escapa los caracteres especiales LDAP
function escapeLdap(input: string): string {
  return input.replace(/[\\*()\x00]/g, (c) => `\\${c.charCodeAt(0).toString(16).padStart(2, '0')}`);
}
const filter = `(uid=${escapeLdap(username)})`;

Ejemplo Real

Las apps empresariales que usan Active Directory u OpenLDAP para autenticación son objetivos comunes. Una inyección LDAP en el formulario de login puede permitir a un atacante autenticarse como cualquier usuario, incluyendo administradores, manipulando el filtro de búsqueda.

Cómo Prevenirlo

  • Escapa todos los caracteres especiales LDAP antes de construir strings de filtro (usa el escaping integrado de ldapjs)
  • Usa queries LDAP parametrizadas donde tu librería las soporte
  • Valida el formato del username (solo alfanumérico) antes de usarlo en cualquier query
  • Aplica el principio de mínimo privilegio a la cuenta de servicio LDAP usada por tu app

Tecnologías Afectadas

nodejsPythonJavaPHP

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas