Command Injection - Python Django Örneği

b0mb

Katılımcı Üye
14 Mar 2017
471
1
İzmir
Merhabalar,

Kısa bir süre önce Django’ya başladım. Kendimi geliştirmek adına ufak bir kaç uygulama yazdım. Bu yazı, Command Injection açığı ve Django’da ö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,
5NQsan.png


İş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.
5NQiPh.png


Şimdi forms dosyamıza ihtiyacımızı görecek bir form ekleyelim.
5NQgWM.png


Şimdi views dosyamıza, ping fonksiyonunu ekleyeceğiz. Yani arkada işleri halledecek fonksiyonu yazacağız şimdi.
CENTER]



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 :p

İ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.
5NQXnp.png


Evet, artık yazdığımız uygulamayı çalıştırıp deneyebiliriz. Hemen çalıştıralım.
5NQBz8.png


Uygulamamızı başlattık, bağlanıp kontrol edelim.
5NQpfj.png

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.
5NQGuo.png


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.
5NQmBU.png


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 :p
5NQvMH.png


Veee...
5NQ1nA.png


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 Django’ya meraklanıp öğrenmeye başlayabilir :)

Yararlanılan kaynaklar:

blackvkng.github.io
 
Moderatör tarafında düzenlendi:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.