drupal

Drupal 7.x SQL Injection Zafiyeti ve Exploit Edilmesi

Drupal 7.0 ile 7.31 versiyonları için geçerli olan SQL Injection zafiyeti tespit edildi. Sektioneins ekibi tarafından tespit edilen zafiyet için Drupal ekibi tarafından güvenlik yaması yayınlanmış bulunmakta. Drupal sistemlerinizi update ederek bu zafiyete karşı önlem almanızı şiddetle tavsiye ederim. 

Zafiyet Analizi

Olay Drupal’in sql sorgusunu kullanıcıdan aldığı verinin array olması durumunda expand etmeye çalışmasından kaynaklanmakta. Bu nedenle UPDATE, DELETE, DROP gibi SQL komutlarını çalıştırabilmek mümkün olmakta.

Eğer kullanıcıdan gelen değişken array ise, oluşacak PHP kodu aşağıdaki şekildedir.

Bu durumda yukarıda tanımlanan fonksiyon iki adet :name değeri oluşturacaktır ve sorgu aşağıdaki hali alacaktır. Burada name_0 ve name_1 değerleri yukarıda tanımlanan fonksiyon tarafında oluşturulmuştur ve içerdikleri değerler sırasıyla user1 ve user2‘dir.

Kullanıcı tarafından alınan array’in birden fazla key’i olduğu durumda ise SQL Injection zafiyeti meydana gelmektedir.

Bu durumda fonksiyon tarafından oluşturulacak sorgu aşağıdaki gibidir.

Exploitation

Zafiyeti exploit ederken seçtiğim hedef, users tablosunda id değeri 1 olan kullanıcının şifresini ve username’ini güncellemek. Drupal multi query desteği verdiği SELECT sorgusundan sonra UPDATE sorgusu çalıştırabilme imkanımız var.

Bir önceki örnekte array’in ilk elemanı — ifadesi içeriyordu. Burada ise noktali virgül içermekte ve böylece SELECT sorgusu tamamlanıp ardından saldırı için oluşturduğumuz UPDATE sorgusu başlamış olacaktır. Drupal’in multiple query özelliği ilede UPDATE sorgusu çalışmış olacaktır.

Burada karşımıza çıkan problem ise Drupal’in password politikası. Pass kolonunu keyfimize göre doldurabilmemiz mümkün değil. Bunun içinse https://github.com/cvangysel/gitexd-drupalorg/blob/master/drupalorg/drupalpass.py adresinde ki kucuk Python classini kullanabiliriz.

 Sonuç:

Exploit çalıştırılmadan önceki ve sonraki users tablosunda ki değişiklikler aşağıdaki gibidir !

Saldırgan olarak sisteme admin ve cokgizlisifre ile giriş yapabilir durumdayız. Tabiki daha tehlikeli olan DROP gibi komutlarıda çalıştırmakta özgürsünüz.

Kaynakça : https://www.sektioneins.de/advisories/advisory-012014-drupal-pre-auth-sql-injection-vulnerability.html