Unsachgemäße Neutralisierung von Spezialelementen in einer LDAP-Abfrage ('LDAP Injection')
Beschreibung
LDAP Injection ist eine Schwachstelle, die auftritt, wenn Software eine LDAP-Abfrage ganz oder teilweise unter Verwendung von extern beeinflussten Eingaben einer vorgelagerten Komponente konstruiert, aber Spezialelemente, die die beabsichtigte LDAP-Abfrage modifizieren könnten, nicht oder nicht korrekt neutralisiert. LDAP (Lightweight Directory Access Protocol) wird weitverbreitet für Authentifizierung, Autorisierung und Verzeichnisdienste in Unternehmensumgebungen verwendet. Angreifer nutzen diese Schwachstelle aus, indem sie LDAP-Metazeichen wie Klammern (), Sternchen *, Pipes |, Ampersands & und Gleichheitszeichen = einschleusen, um Abfragen zu manipulieren. Dies kann Authentifizierungsumgehung, unbefugten Datenzugriff, Informationsoffenlegung über Verzeichnisstruktur und in einigen Fällen Modifikation von Verzeichniseinträgen ermöglichen.
Risiko
LDAP Injection stellt erhebliche Risiken in Unternehmensumgebungen dar, wo LDAP-Verzeichnisse oft sensible organisatorische Daten einschließlich Benutzeranmeldedaten, Gruppenmitgliedschaften, Zugriffsberechtigungen und persönlicher Informationen enthalten. Erfolgreiche Angriffe können Authentifizierungsmechanismen umgehen und unbefugten Zugriff auf geschützte Ressourcen ermöglichen. Angreifer können Verzeichnisinhalte aufzählen, um Organisationsstruktur zu kartieren, hochwertige Ziele zu identifizieren und privilegierte Konten zu entdecken. In beschreibbaren LDAP-Szenarien können Angreifer Verzeichniseinträge modifizieren, um Privilegien zu eskalieren, Backdoor-Konten zu erstellen oder Zugriffskontrollen zu ändern. Die Verbreitung von Active Directory in Unternehmensumgebungen macht LDAP Injection zu einem hochwertigen Ziel für Angreifer, die Domänenkompromittierung anstreben.
Lösung
Verwenden Sie parametrisierte LDAP-Abfragen oder APIs, die Sonderzeichen automatisch escapen. Beim Konstruieren von LDAP-Filtern codieren Sie alle LDAP-Sonderzeichen einschließlich *, (, ), \ und Null-Zeichen mit ihren escapten Darstellungen (z.B. * wird zu \2a, ( wird zu \28). Implementieren Sie strikte Eingabevalidierung mit Allowlists für erwartete Datenformate. Validieren Sie, dass Benutzernamen, Suchbegriffe und andere Eingaben erwarteten Mustern entsprechen, bevor sie in Abfragen verwendet werden. Wenden Sie das Least-Privilege-Prinzip auf LDAP-Dienstkonten an und beschränken Sie ihre Berechtigungen auf das Notwendige. Erwägen Sie die Verwendung von LDAP-Bibliotheken, die integrierten Injection-Schutz bieten.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Vertraulichkeit | Bereich: Vertraulichkeit Angreifer können sensible Verzeichnisinformationen extrahieren, einschließlich Benutzerdetails, Gruppenmitgliedschaften, Organisationsstruktur und potenziell Passwort-Hashes. |
| Zugriffskontrolle | Bereich: Zugriffskontrolle Authentifizierungsumgehung durch LDAP Injection ermöglicht unbefugten Zugriff auf geschützte Systeme und Ressourcen ohne gültige Anmeldedaten. |
| Integrität | Bereich: Integrität In Verzeichnissen mit Schreibzugriff können Angreifer Einträge modifizieren, Gruppenmitgliedschaften ändern, Zugriffskontrollen ändern oder unbefugte Konten erstellen. |
Beispielcode + Lösungscode
Anfälliger Code
// ANFÄLLIG: Direkte String-Verkettung in LDAP-Abfrage
public boolean authenticate(String username, String password) {
Hashtable<String, String> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://ldap.example.com:389");
try {
DirContext ctx = new InitialDirContext(env);
// ANFÄLLIG: Benutzereingabe direkt im Filter
// Angriff: username=*)(uid=*))(|(uid=*
// Ergibt: (&(uid=*)(uid=*))(|(uid=*)(userPassword=...))
String filter = "(&(uid=" + username + ")(userPassword=" + password + "))";
SearchControls controls = new SearchControls();
NamingEnumeration<SearchResult> results = ctx.search("ou=users,dc=example,dc=com", filter, controls);
return results.hasMore();
} catch (NamingException e) {
return false;
}
}
Korrigierter Code
public boolean authenticate(String username, String password) {
// Eingabeformat validieren
if (!username.matches("^[a-zA-Z0-9._-]+$")) {
throw new IllegalArgumentException("Ungültiges Benutzernamenformat");
}
Hashtable<String, String> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://ldap.example.com:389");
try {
DirContext ctx = new InitialDirContext(env);
// SICHER: LDAP-Sonderzeichen escapen
String safeUsername = escapeLDAPSearchFilter(username);
String safePassword = escapeLDAPSearchFilter(password);
String filter = "(&(uid=" + safeUsername + ")(userPassword=" + safePassword + "))";
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
controls.setReturningAttributes(new String[]{"uid"});
NamingEnumeration<SearchResult> results = ctx.search("ou=users,dc=example,dc=com", filter, controls);
return results.hasMore();
} catch (NamingException e) {
return false;
}
}
// LDAP-Sonderzeichen-Escaping-Funktion
public static String escapeLDAPSearchFilter(String input) {
StringBuilder sb = new StringBuilder();
for (char c : input.toCharArray()) {
switch (c) {
case '\\': sb.append("\\5c"); break;
case '*': sb.append("\\2a"); break;
case '(': sb.append("\\28"); break;
case ')': sb.append("\\29"); break;
case '\0': sb.append("\\00"); break;
default: sb.append(c);
}
}
return sb.toString();
}
Ausgenutzt in der Praxis
Unternehmens-Verzeichnis-Enumerationsangriffe (Unternehmen, fortlaufend)
LDAP Injection wird häufig von Angreifern während Aufklärungsphasen gezielter Angriffe gegen Unternehmen verwendet, die Active Directory nutzen. Angreifer nutzen LDAP Injection in Webanwendungen aus, die sich gegen AD authentifizieren, um Benutzer, Gruppen und Organisationseinheiten aufzuzählen und Informationen für nachfolgende Angriffe zu sammeln.
Authentifizierungsumgehung in Unternehmensanwendungen (Verschiedene, historisch)
Mehrere Unternehmensanwendungen einschließlich CRM-Systeme, HR-Plattformen und Identity-Management-Lösungen wurden als anfällig für LDAP Injection befunden, was Authentifizierungsumgehung und unbefugten Zugriff auf sensible Geschäftsdaten ermöglichte.
Tools zum Testen/Ausnutzen
-
Burp Suite — Web-Sicherheitstestplattform mit Fähigkeiten zum Testen von LDAP Injection durch Parametermanipulation.
-
LDAP Injection Payloads — Sammlung von LDAP-Injection-Payloads für verschiedene Angriffsszenarien.
-
ldapsearch — Befehlszeilentool für manuelles LDAP-Abfrage-Testen und Injection-Verifizierung.
CVE-Beispiele
-
CVE-2023-2825 — GitLab LDAP Injection ermöglicht unbefugten Zugriff auf Benutzerinformationen.
-
CVE-2021-45105 — Apache Log4j LDAP Injection im Zusammenhang mit JNDI-Lookup-Funktionalität.
Referenzen
-
MITRE. "CWE-90: Improper Neutralization of Special Elements used in an LDAP Query." https://cwe.mitre.org/data/definitions/90.html
-
OWASP. "LDAP Injection Prevention Cheat Sheet." https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html
-
OWASP. "LDAP Injection." https://owasp.org/www-community/attacks/LDAP_Injection