LDAP-Injection
LDAP-Allgemein
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 daher 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 in 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 ein 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 zum 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 auch Whitelists für Zeichen 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".