~Tanım~
Command injection, kötü niyetli bir saldırganın, bir web uygulaması veya başka bir bilgisayar programının hatalı veya güvenliksiz bir şekilde yazılmış giriş kontrollerini kullanarak hedef sistemde komut çalıştırmasına izin veren bir güvenlik açığıdır.
Bu tür bir saldırıda, saldırgan uygulamaya normal bir kullanıcı gibi girer ve özel karakterler veya kodlar kullanarak uygulamayı aldatır. Bu, saldırganın uygulamayı istediği şekilde yönlendirmesine ve hedef sistemde kötü amaçlı kod çalıştırmasına neden olabilir.
Örneğin, bir web uygulaması, kullanıcının arama sorgusu olarak girilen metni bir komut olarak yorumlayarak sonuçları gösterir. Saldırgan, bu giriş alanına bir komut enjekte ederek hedef sistemi etkileyebilir. Bu, saldırganın kötü amaçlı kodları yürütmesine ve hedef sistemde önemli veri kaybına veya diğer zararlara neden olmasına neden olabilir.
Yani enjekte ettiğimiz komutun sistemdeki bir terminal de çalışması gerekir.
~Uygulama~
Labımıza geldiğimiz de bizi bir ping atma sayfası karşılıyor. ilk önce normal bir ping atalım.
Görüldüğü üzere başarılı bir şekilde çalışıyor.
Şimdi sistemimizde zafiyet var mı diye komutumuzun sonuna herhangi bir payload ekleyerek sistemde komut çalıştırabiliyor muyuz bunu test edelim. Yazacağımız payloadların genel çalışma mantığı ise x komutundan sonra y komutunu çalıştır şeklinde ilerliyor.
Bazı örnek payloadlar.
Windows için;
| dir
; dir
$(`dir`)
& dir
Linux için;
;id;
|id
$;/usr/bin/id
$(`cat /etc/passwd`)
&&id
Yukarıdaki payloadlardan birini kopyalıyorum.
ve tekrar ping attırıyorum.
Görüldüğü gibi bu sefer "|" payloadı sayesinde sistemimizde bulunduğumuz dizinde hangi dosyalar var bunları görebildik demek ki burada os command injection zafiyeti var. Os command injection zafiyeti çok tehlikeli bir zafiyet olduğundan dolayı dışarıdan bir dosya çekebiliriz.
Şimdi ise "İndex Basmak" olarak tabir ettiğimiz olayı gerçekleştirmek için '8.8.8.8 | echo "Hacked By P4$A" > owned.html' burada ekrana yazdırdığım komutu bir dosyanın içine kayıt edip zafiyetimi sömürüyorum.
Burp ile araya girip yolladığım isteği gösterdim. Şimdi bakalım index yemiş mi sayfamız;
Görüldüğü gibi owned.html dosyamızı istediğimizi yazdırmış olduk, isteyen shell de yazdırabilir istediğini yapar.
~Zafiyetin Oluştuğu Yer~
index.php dosyamızda form aracılığı ile post methodu ile kullanıcıdan bir değer alınmış bunu value olarak ping e yansıtmış ve bunun işleneceği yer olarak ci.php dosyasını göstermiş şimdi ci.php dosyasına bakalım.
Burayı da yorumlamak gerekir ise bir ip değişkeni oluşturulup index.php den ismi ip olarak gönderilen değişkene atama yapılmış daha sonra find değişkenini shell_exec fonsiyonun içinde ping atma işlemin de kullanılıp ekrana yazdırılmış, shell_exec komutu isminden de anlaşılabileceği üzere bir shell yani terminal üzerinde komut çalıştırmaya yarıyor burada zafiyetin oluşmasının sebebi ise 2 türlüdür.
1- Kullanıcıdan alınan ip direk filtrelemeden geçirilmemeliydi.
2- Direk ekrana yansıtıyorsak shell_exec komutunu "htmlspecialchars(shell_exec('ping ' .$ip));" gibi kullanarak filtreleseydik herhangi bir özel karakter çalışmayacağından zafiyet kaynaklanmayacaktı.
Kaynak Kodlarını Olabildiğince Göstermeye Devam Edeceğim.
Okuduğunuz İçin Teşekkürler
Tarih pes edenleri değil mücadele edenleri de yazar.