Command Injection Nedir?
Command injection, kod çalıştırma açıklığı olarak da bilinen bir zafiyet çeşididir. Bu zafiyetin sistemde kullanıcıdan input (girdi) alınan her yerde bulunma ihtimali oldukça fazladır. Command injection zafiyeti kullanıcının girmiş olduğu verinin yanında Linux ya da windows komutları çalıştırmasına olanak sağlar. Bu zafiyet çeşidi oldukça tehlikeli ve sömürmesi çokta zor olmayan bir zafiyettir. Zafiyetin var olduğu sistemde sisteme uzaktan erişim sağlama,dosya ekleme,silme,değiştirme gibi birçok izin verilen komutlar kullanılabilir.
Bu zafiyet cmd veya Linux terminalinde komut çalıştırmaya benzer dilerseniz bir örnek üzerinde inceleyelim.
https://zafiyetlisite.com/satınalmakontrol?urunID=1234&magazaID=92
elimizde bir alışveriş sitesi mevcut ve bu sitede ürün satın alırken yukarıdaki gibi bir “get” isteği dönmekte.Web uygulamamız bu sorguyu sql vb. veri tabanlarından almak yerine kendi veritabanında daha önceden yazmış olduğu kod yardımı ile bir sorgu döndürüyor.
Web uygulamasının döndürdüğü sorgu kodu şu şekilde olsun:
Satınalmakontrol.sh 1234 92
Bu kod ile uygulama kullanıcıya satın alma bilgilerini listeliyor fakat listeleme esnasında gerekli güvenlik önlemleri alınmamış ise kullanıcı gönderdiği sorguyu değiştirerek sistem üzerinde komut çalıştırabilir
Örnek olarak:
Satınalmakontrol.sh 1234 92|echo “I HACK YOU”
Bu komut ile ekrana satın alma bilgilerinin yanı sıra “ı hack you” yazdırabiliriz.
Command injection zafiyeti için örnekler oldukça çoğaltılabilir sizlere owasp’ın yayınladığı örneklerin bulunduğu web sitesinin linkini bırakıyorum dilerseniz bakabilirsiniz.
Command İnjection karakter kullanımı
Gerek Windows gerekse Unix tabanlı sistemlerde birden fazla komut çalıştırmak için bazı karakterler kullanılır aşağıda görmüş olduğunuz karakterler hem Windows hem de Unix tabanlı sistemlerde kullanılan karakterlerdir.
- &=and operatörü olarak bilinen bu karakter kodlama dillerinde oldukça fazla kullanılmaktadır.
- &&=mantıksal and operatörü ilk komut başarıyla tamamlandığı zaman ikinci komutu çalıştırır.
- |=pipe (borulama) işlemi olarak adlandırılan bu işaret ilk komuta output(çıktı) ikinci komuta input(girdi) verir.
- ||=mantıksal or operatörü ilk komut çalışmaz ise ikinci komutu çalıştırır.
Bu ifadeler sadece Unix tabanlı işletim sistemlerinde geçerlidir:
- ;
- 0x0a veya \n= yeni satıra geçer.
- `komut`
- $(komut)
sizlere command injection zafiyeti için hazırlanmış olan bir payload linki bırakıyorum dilerseniz inceleyebilirsiniz.
Command İnjection Lab Örnekleri
Şimdi sizlere bWapp üzerinde görsel olarak command injection açıklığını örneklendireceğim.
Aşağıda bize arama yapabilmemiz için sunulan bir “search” kısmı bulunmakta.
Burada” www.nsa.gov” adlı bir domaini hazır olarak vermiş “lookup” butonuna tıkladığımızda karşımıza o domaine ait bazı bilgiler çıkıyor.
Şimdi biz yukarıda öğrendiğimiz karakterleri kullanarak burada bazı Linux komutlarını çalıştırmayı deneyeceğiz.
İlk başta “&” ifadesini kullanarak “id” komutunu çalıştırmayı deniyorum.
Ve burada gördüğünüz gibi bize “www-data” kullanıcısının id numarasını sonuç kısmında verdi.
Dilerseniz birde”;” ifadesi ile deneyelim.
Bu sefer “;” ifadesi kullanarak “cat” komutu ile “/etc/passwd” dosyasını okumaya çalışacağım.
Gördüğünüz gibi bu komutumuzuda başarıyla çalıştırabildik.
Bu açıklığın high veya medium modunda bazı karakterler filitrelenmiş olabilir yani bazı karakterlere izin verilmeyebilir onun dışında çalışma mantığı aynıdır.
Command Injection Zafiyeti Nasıl Önlenir
Zafiyetin oluşum nedeni sistem komutlarının kullanımından kaynaklanmaktadır.En mantıklı korunma yöntemi sistem komutlarının kullanımına izin verilmemesidir.Ama eğer bir nedenden ötürü izin verildiyse aşağıdaki gibi bazı önlemler alınabilir.
- Kullanıcıdan alınan input (girdi) formatının kontrolünün sağlanması ve yetki analizinin yapılması.
- Sistem üzerinde girdileri değerlendirmek için “White-list,Black-list” gibi yapıların oluşturulması.
- İnput (girdi) işleminin yalnızca alfanumerik karakterlerden oluşması.
- Özel karakterlerin site içerisinde kullanımının kısıtlanması ya da engellenmesi.
Evet bu yazımızda command injection açığının ne olduğundan ve korunma yollarından bahsettik umarım faydalı bir yazı olmuştur.