LDAP Injection ist eine weitere Schwachstelle ähnlich der SQL Injection. Hier werden ungefilterte Benutzereingaben als Code ausgeführt.
Was ist LDAP Injection?
Bei einer LDAP Injection wird die Benutzereingabe gar nicht oder unzureichend gefiltert in eine LDAP Abfrage eingefügt. Jetzt ist die Frage: ‚Was ist LDAP?‘. LDAP steht für Lightweight Directory Access Protocol und dient dem Namen nach dazu ein Verzeichnis zugänglich zu machen. Konkret wird LDAP dazu genutzt, um Benutzerverzeichnisse, wie sie in Netzwerken vorkommen, nach Benutzernamen, Passwörtern oder anderen Attributen abzufragen. Das häufigste dieser Directories ist das Active Directory, welche in Windows Netzwerken oder in Azure genutzt wird.
Wie sieht eine LDAP Abfrage aus?
Eine beispielhafte LDAP Abfrage sieht so aus
(&(username=inputusernamefield)(password=inputpasswordfield))
Es werden offensichtlich die Attribute username und password im Directory mit den eingegeben Werten des username-Textfeldes und des password-Textfeldes abgeglichen. Also klassisch die Abfrage stimmen die eingegeben Werte eines Logins auf einer Webseite mit den Daten im Directory zusammen? Das & Am Anfang des Ausdrucks bedeutet, dass beide Vergleiche TRUE zurückgeben müssen.
Wie wird eine LDAP Injection ausgeführt?
Weiß ein Angreifer, dass bestimmte Eingabefelder, welche er kontrolliert in eine LDAP-Abfrage, wie beispielsweise oben zu sehen, eingebaut werden, dann können mehrere Abfrage konstruiert werden:
(&(username=*)(password=*))
(&(username=max)(&))(password=irgendwas)
(&(username=max)(username=max))(|(username=max)(password=irgendwas))
Angenommen es ist bekannt, dass der Benutzername max im Directory existiert, dann können die gelb-markierten Injections zu einer erfolgreichen Abfrage (und damit zu einem Login) führen je nach eingesetzter LDAP-Version.
Der erste Ausdruck nutzt die Tatsache aus, dass * eine Wildcard ist. Der zweite Ausdruck nutzt die Tatsache aus, dass eine LDAP-Implementierungen nur einen Filter auswerten, sodass (password=irgendwas) gar nicht mehr ausgewertet wird. Der dritte Ausdruck ist immer wahr (sofern max existiert), da der zweite Filter ein ODER-Filter ist (das erkennt man an der Pipe |).
Was ist eine Blind LDAP-Injection?
Angenommen man versucht das Passwort eines Benutzer herauszufinden, kann man mit
(&(username=max)(password=Passw*))
herausfinden, ob das Passwort mit Passw beginnt. Probiert ein Angreifer hier kontinuierlich alle Buchstaben durch, kann ein Passwort im Klartext ermittelt werden.
Wer tiefergehende Einblicke in LDAP Injection haben will oder weitere Anwendungsfälle sehen will, kann gerne mal hier reinschauen.
2 Kommentare
Überblick Pentesting – Maxanit Consulting · Dezember 14, 2020 um 8:26 pm
[…] LDAP Injection […]
Überblick Bug-Bounty-Artikel – Maxanit Consulting · Dezember 14, 2020 um 8:26 pm
[…] LDAP Injection […]