Merhabalar,
Kısa bir süre önce Djangoya başladım. Kendimi geliştirmek adına ufak bir kaç uygulama yazdım. Bu yazı, Command Injection açığı ve Djangoda örneğini içeriyor olacak. Tüm dosyalara GitHub üzerinden ulaşabilirsiniz.
Command Injection Nedir?
Command injection, uygulamadan kaynaklı bir hata sayesinde uygulamanın bulunduğu sistem üzerinde keyfi komut çalıştırma saldırısıdır. Command injection saldırıları, alınan verinin herhangi bir kontrolden geçirilmeden direk sistemde çalıştırılması ile oluşur.
Command injection, Code injection ile karıştırılmamalıdır. Code injection saldırılarında, uygulamanın yazıldığı dilde komutlar ile çalışırsınız fakat command injection saldırılarında direk sistem komutları ile çalışırsınız.
Python ile örneği
Gördüğünüz üzere, hiçbir önlem alınmadan host parametresinin aldığı değer sistemde ping komutu ile çalıştırılmış. Hemen nasıl istismar edebileceğimize bakalım bu kodu,
İşte! Gördünüz mü? Biz, host parametresine sadece google.com yazmak yerine, google.com && uname -a yazdık ve bu sayede ping işlemine ek olarak uname -a komutunu da sistemde çalıştırmış olduk
Django Uygulaması
Hemen template klasörümüze formun yer alacağı dosyayı oluşturalım.
Şimdi forms dosyamıza ihtiyacımızı görecek bir form ekleyelim.
Şimdi views dosyamıza, ping fonksiyonunu ekleyeceğiz. Yani arkada işleri halledecek fonksiyonu yazacağız şimdi.
Resimde görüldüğü gibi, ping fonksiyonu, request adında bir parametre alıyor. Eğer gelen istek POST ise formdan gelen değeri ipaddress değişkenine atıyor. Şimdi fark ettim de for döngüsü ile liste oluşturmaktansa direk list() fonksiyonunu kullanabilirdim. Hatta elimdeki veri sözlük türünde olduğu için request.POST[ipaddress] şeklinde de istediğim veriye ulaşabilirdim. Neden öyle yaptığımı hatırlamıyorum
İstediğimiz değeri aldıktan sonra, alınan değeri ping -w 5 ile birleştirip hiçbir sorgu olmadan sistemde çalıştırıp çıktıyı result değişkenine atamışım. Ardından çıktıyı <pre> tagı içine alıp HttpResponse objesi içinde döndürmüşüm. Herhangi bir template kullanmaya gerek duymadım.
Çalıştırmadan yapmamız gereken bir şey daha var, urls dosyasına ekleme yapmak.
Evet, artık yazdığımız uygulamayı çalıştırıp deneyebiliriz. Hemen çalıştıralım.
Uygulamamızı başlattık, bağlanıp kontrol edelim.
Evet! Uygulamamız çalışıyor. Hemen istismar etmeye çalışalım uygulamayı. Ping işlemi ve bizim çalıştıracağımız komut arasında bir satır boşluk olsun diye araya echo ekledim.
Tam da istediğimiz gibi... Ping işleminin yanında verdiğimiz uname -r komutu başarılı bir şekilde çalıştı. Bundan sonra sistemi istediğiniz gibi kontrol edebilirsiniz.
Alınabilecek Önlemler
Alınabilecek en basit önlem, gelen verinin önceden izin verilen karakterler içinde olup olmadığını kontrol etmek. İzin verilen karakterler şunlar olacak:
"abcdefghijklmnopqrstuvwxyz0123456789.". Hemen örneğini gösterelim.
Eğer ipaddress içerisinde yer alan herhangi bir harf izin verilen harflerin bulunduğu chars değişkeninde yoksa, sistemde herhangi bir şey çalıştırmıyor ve ekrana Neyin peşindesin bro!? yazdırıyor
Veee...
Eğer uslu uslu istenilen gibi bir değer girersek, program düzgün çalışacaktır.
Biraz basit bir konu oldu ama belki birileri Djangoya meraklanıp öğrenmeye başlayabilir
Yararlanılan kaynaklar:
blackvkng.github.io
Kısa bir süre önce Djangoya başladım. Kendimi geliştirmek adına ufak bir kaç uygulama yazdım. Bu yazı, Command Injection açığı ve Djangoda örneğini içeriyor olacak. Tüm dosyalara GitHub üzerinden ulaşabilirsiniz.
Command Injection Nedir?
Command injection, uygulamadan kaynaklı bir hata sayesinde uygulamanın bulunduğu sistem üzerinde keyfi komut çalıştırma saldırısıdır. Command injection saldırıları, alınan verinin herhangi bir kontrolden geçirilmeden direk sistemde çalıştırılması ile oluşur.
Command injection, Code injection ile karıştırılmamalıdır. Code injection saldırılarında, uygulamanın yazıldığı dilde komutlar ile çalışırsınız fakat command injection saldırılarında direk sistem komutları ile çalışırsınız.
Python ile örneği
Kod:
[COLOR="LemonChiffon"]import os
def ping(host):
os.system(ping -w 3 + host)[/COLOR]
Gördüğünüz üzere, hiçbir önlem alınmadan host parametresinin aldığı değer sistemde ping komutu ile çalıştırılmış. Hemen nasıl istismar edebileceğimize bakalım bu kodu,
İşte! Gördünüz mü? Biz, host parametresine sadece google.com yazmak yerine, google.com && uname -a yazdık ve bu sayede ping işlemine ek olarak uname -a komutunu da sistemde çalıştırmış olduk
Django Uygulaması
Hemen template klasörümüze formun yer alacağı dosyayı oluşturalım.
Şimdi forms dosyamıza ihtiyacımızı görecek bir form ekleyelim.
Şimdi views dosyamıza, ping fonksiyonunu ekleyeceğiz. Yani arkada işleri halledecek fonksiyonu yazacağız şimdi.
Resimde görüldüğü gibi, ping fonksiyonu, request adında bir parametre alıyor. Eğer gelen istek POST ise formdan gelen değeri ipaddress değişkenine atıyor. Şimdi fark ettim de for döngüsü ile liste oluşturmaktansa direk list() fonksiyonunu kullanabilirdim. Hatta elimdeki veri sözlük türünde olduğu için request.POST[ipaddress] şeklinde de istediğim veriye ulaşabilirdim. Neden öyle yaptığımı hatırlamıyorum
İstediğimiz değeri aldıktan sonra, alınan değeri ping -w 5 ile birleştirip hiçbir sorgu olmadan sistemde çalıştırıp çıktıyı result değişkenine atamışım. Ardından çıktıyı <pre> tagı içine alıp HttpResponse objesi içinde döndürmüşüm. Herhangi bir template kullanmaya gerek duymadım.
Çalıştırmadan yapmamız gereken bir şey daha var, urls dosyasına ekleme yapmak.
Evet, artık yazdığımız uygulamayı çalıştırıp deneyebiliriz. Hemen çalıştıralım.
Uygulamamızı başlattık, bağlanıp kontrol edelim.
Evet! Uygulamamız çalışıyor. Hemen istismar etmeye çalışalım uygulamayı. Ping işlemi ve bizim çalıştıracağımız komut arasında bir satır boşluk olsun diye araya echo ekledim.
Tam da istediğimiz gibi... Ping işleminin yanında verdiğimiz uname -r komutu başarılı bir şekilde çalıştı. Bundan sonra sistemi istediğiniz gibi kontrol edebilirsiniz.
Alınabilecek Önlemler
Alınabilecek en basit önlem, gelen verinin önceden izin verilen karakterler içinde olup olmadığını kontrol etmek. İzin verilen karakterler şunlar olacak:
"abcdefghijklmnopqrstuvwxyz0123456789.". Hemen örneğini gösterelim.
Eğer ipaddress içerisinde yer alan herhangi bir harf izin verilen harflerin bulunduğu chars değişkeninde yoksa, sistemde herhangi bir şey çalıştırmıyor ve ekrana Neyin peşindesin bro!? yazdırıyor
Veee...
Eğer uslu uslu istenilen gibi bir değer girersek, program düzgün çalışacaktır.
Biraz basit bir konu oldu ama belki birileri Djangoya meraklanıp öğrenmeye başlayabilir
Yararlanılan kaynaklar:
- https://www.owasp.org/index.php/Command_Injection
- https://docs.djangoproject.com/en/1.11/topics/forms/
blackvkng.github.io
Moderatör tarafında düzenlendi: