05 Nisan 2015

Web Uygulama Denetimi - Bölüm-16: LDAP Enjeksiyonu

LDAP protokolü ile dizin servislerine ulaşılır. Tipik bir LDAP sorgusu aşağıdaki yapıda olup ldap sunucu adresinden sonra gelen bir arama filtresi (search filter) ve döndürülmesi beklenen özellikler (attributes)’den oluşur:

<LDAP://ldapsunucusu>;(givenName=Ali);cn,telephoneNumber,department


Sorgu Özellikleri Enjeksiyonu

Eğer LDAP sorgusu sonuçları görüntülüyorsa daha fazla özellik görüntülenmesi için enjeksiyon yapılması mümkündür. Örneğin yukarıdaki sorguda arama filtre kriteri kullanıcı girdisi kullanılarak oluşturuluyorsa aşağıdaki girdi:

Ali);mail,cn;

şu sorgu ifadesinin oluşmasına neden olur:

<LDAP://ldapsunucusu>;(givenName=Ali);mail,cn;);cn,telephoneNumber,department

Bu şekilde ek olarak “mail” özelliğinin bilgisi de görüntülenmiş olur. Ayrıca “cn;);cn” başlıklı boş bir kolon oluşur. LDAP sorgularında özellikler (attributes) virgülle ayrıldığından iki virgül arasındaki ifadeler özellik ismi olarak algılanır. Active Directory mevcut olmayan özellikler istendiğinde hata verir, ancak özellik ismi geçerli bir isim olup da noktalı virgülle takip edilirse bunu tolere eder. Bu yüzden enjekte edilen metnin sonunda “cn;” girilir.

Ayrıca sorgu filtresi olarak “*” işareti “wildcard” anlamına gelmekte olup “Ali” yerine “*” kullanılsaydı tüm kayıtlar görüntülenebilirdi.

Sorgu Filtresinin Değiştirilmesi

Bazı durumlarda kullanıcı girdisi tek filtre olarak değil daha kompleks bir filtrenin parçası olarak girilir. Örneğin kullanıcının sadece Türkiye’deki personelin bilgilerini izleme hakkı olması durumunda şöyle bir sorgu oluşturulabilir:

<LDAP://ldapsunucusu>;(&(givenName=Ali)(c=Turkiye);cn,telephoneNumber,department,c
Bu sorgudaki “&” işareti iki kriteri “ve” operatörü olarak iki koşulu bağlamaktadır. Bu durumda personel adı alanına “*));cn,cn;” metni girilmesi durumunda sorgu şu hali alacaktır:

<LDAP://ldapsunucusu>;(&(givenName=*));cn,cn;)(c=Turkiye);cn,telephoneNumber,department,c
Bu girdi sorgunun mantığı ülke olarak Türkiye koşulunu kaldıracak ve tüm ülkelerdeki tüm personel bilgilerini döndürülmesine neden olacaktır. Filtreden sonraki ikinci virgülden üçüncü virgüle kadar olan “cn;)(c=Turkiye);cn” boş bir alan olarak görüntülenecektir.

LDAP Enjeksiyon Açıklıklarının Tespiti


LDAP sorgularına geçersiz girdi enjekte edildiğinde genellikle anlamlı bir hata mesajı dönmez. LDAP enjeksiyon açıklığının varlığına işaret olabilecek belirti bir arama fonksiyonunun hatalı girdi sonrası HTTP 500 statü kodu gibi bir sunucu hatası döndürmesidir. Yine de aşağıdaki adımlar belli bir güvenilirlik derecesiyle LDAP enjeksiyon açıklıklarının belirlenmesi için kullanılabilir:
  • Arama kriteri olarak sadece “*” karakterini girilir. Bu karakter LDAP için wildcard olmakla birlikte SQL arama kritieri olarak bu anlama gelmez. Eğer çok miktarda kayıt dönerse büyük ihtimalle LDAP kullanılıyor demektir.
  • Çok sayıda kapatma parantezi girilir:
    • ))))))))))
Bu pek çok durumda uygulama mantığını bozacaktır. Ancak LDAP sorgusu ile uğraştığınızı düşünüyorsanız arama filtresinin içinde yer aldığı parantezi fazladan kapatacağından sorgu hata üretecektir. Böyle bir durum LDAP sorgusuna enjeksiyon yaptığınız ihtimalini güçlendirir.
  • Aşağıdaki girdilerde olduğu gibi parantez sayısı artırılarak doğru parantez sayısı hata alınmayınca tespit edilir:
    • *);cn;
    • *));cn;
    • *)));cn;
    • *))));cn;
  • Girdinin sonuna yeni özellikler (attribute) girilerek ek bilgi almaya çalışılır. Dizinlerde sıklıkla kullanılan özelliklere aşağıdakiler örnek verilebilir:
    • cn, c, mail, givenname, o, ou, dc, l, uid, objectclass, address, dn, sn


<<Önceki Bölüm                                                                                                      Sonraki Bölüm>>