LDAP-Injection

LDAP

LDAP steht für Lightweight Directory Access Protocol. Es ist Bestandteil von Microsofts Active Directory. Es dient dazu Informationen über Benutzer und Gruppen bereitzustellen. LDAP wird häufig für Applikationen mit SSO (Sigle-Sign-On) genutzt. Außerdem gibt es LDAP auch als Open Source Variante und nennt sich Open LDAP. Open LDAP kommt zum Beispiel im Samba Protokoll zum Einsatz.

LDAP-Injection

Wird LDAP auf einer Webseite verwendet ohne, dass die Eingaben geprüft werden, dann sind LDAP-Injections möglich. LDAP-Injections sind vom Aufbau ähnlich zu SQL-Injections. Es wird dabei versucht die eigenen Rechte auf einem Zielsystem auszuweiten und unautorisierte Abfragen durchzuführen. LDAP verwendet in den Befehlen sogenannte Filter bzw. Filterlisten. Diese sind mit „Und“ (&) bzw. „Oder“ (|) verknüpft. Die einzelnen Filter setzen sich aus dem Attribut und dem eigentlichen Wert zusammen (Attribut=Wert). Diese Filterlisten können beliebig lang sein. Ein gültiger LDAP Befehl sieht wie folgt aus:

(&(Attribut1=Wert1)(Attribut2=Wert2)...(AttributN=WertN))
(|(A ttribut1=Wert1)(Attribut2=Wert2)...(AttributN=WertN))

Auch wenn es möglich ist mehrere Befehle auf einmal an einen LDAP-Server zu senden, so wird immer nur der erste Befehl ausgeführt. Je nach Implementation wird der zweite Befehl auf korrekte Syntax geprüft.

Wird der folgende Befehl:

(&(Attribut1=Wert1)(Attribut2=Wert2))(&(AttributN=WertN)(AttributM=WertM))

an einen LDAP-Server gesendet, so wird nur der Befehl mit Attribut1 und Attribut2 ausgeführt. Der Befehl mit AttributN und AttributM wird nicht ausgeführt, sondern verworfen.

Nutzt nun eine Webseite LDAP zum Login der Nutzer, ohne die Eingaben zu prüfen, so ist es möglich sich als ein beliebiger Nutzer anzumelden. Eine Webseite könnte z.B. folgenden Code zur Authentisierung der Nutzer verwenden:

(&(USER=Uname)(PASSWORD=Pwd))

Übergibt man nun als Benutzer foobar)(&))foobar)(&)), dannsieht der zu verarbeitenden Befehl wie folgt aus:

(& (USER=foobar)(&))(PASSWORD=Pwd))

Da nur der erste Befehl ausgeführt wird, würde man ohne Password eingeloggt werden, da der erste Befehl wahr ist, sofern der Nutzer existiert.

Gegenmaßnahmen

LDAP-Injections lassen sich nur ausnutzen, wenn die Eingaben nicht geprüft werden. Daher sollten bestimmte Zeichen aus Eingaben herausgefiltert werden. Alternativ könne für die Zeichen auch Whitelists erstellt werden. Außerdem gibt es für LDAP Frameworks, die die Implementation erleichtern und Angriffen vorbeugen. Ein beliebtes C# Framework für LDAP ist "LINQtoAD".[1]

  1. [LDAP Injection Prevention],Vgl. OWASP LDAP Injection Prevention Cheat Sheet, URL:https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html (Stand: 27.07.2020)