Tanımı

OS komut enjeksiyonu -ya da kabuk enjeksiyonu-, saldırganın, zafiyetli uygulamayı çalıştıran sunucuda keyfi şekilde işletim sistemi (OS) komutları yürütmesine, genellikle uygulamanın ve tüm verilerin tamamen tehlikeye girmesine izin veren bir web güvenlik açığıdır. Uygulamaların, sistem komutlarını yürütmek için system () veya exec () gibi kabuk fonksiyonlarını çağırırken kullandıkları parametreleri düzgün bir şekilde doğrulayamadığı ve sanitize edemediği durumlarda ortaya çıkar.

Tespiti ve İstismarı

1- Doğrudan Komut Enjeksiyonu

İlk olarak saldırgan, uygulamanın doğrudan kullanıcı tarafından girilen verileri komuta argüman olarak ileterek bir sistem komutu çağırdığını keşfeder. Daha sonra, beklenen argümanların bir parçası olarak zararlı komutu girer. Böylece uygulama, orijinal komutu ve hemen ardından zararlı komutu yürütür.

Adım adım bakacak olursak:

1.1- Saldırgan, uygulamanın bir komutu yürütmek için istemci girdisini kullandığını keşfeder.

1.2- İstemci girdisinin bir parçası olarak zararlı komutu uygulamaya gönderir.

1.3- Son olarak da zararlı komutu yürüten uygulamanın davranışını gözlemler.

2- Dolaylı Komut Enjeksiyonu

Bu komut enjeksiyonu örneği, savunmasız uygulamaya ek komutun, bir dosya veya ortam değişkeni aracılığıyla dolaylı olarak gönderilmesiyle oluşur. İlk olarak saldırgan, uygulamanın -dosya veya ortam değişkeni gibi- harici kaynaktan gelen verileri kullanarak bir sistem komutu çağırdığını keşfeder. Daha sonra zararlı bir komut eklemek için dış kaynağın içeriğini değiştirir. Ardından, uygulamayı orijinal komutla birlikte zararlı komutu yürütmeye zorlar.

Yine adım adım bakalım:

2.1- Saldırgan, uygulamanın komut yürütmek için harici bir kaynakta depolanan verileri kullandığını keşfeder.

2.2- Dış kaynağı kötü amaçlı komut içerecek şekilde düzenler.

2.3- Uygulamanın orijinal komutu yürütmesini bekler ya da uygulamayı buna zorlar.

2.4- Son olarak, uygulamanın enjekte edilen komutu yürüttüğünü doğrular.

3- Kör Komut Enjeksiyonu

OS komut enjeksiyonunun bir türü de kör komut enjeksiyonudur. Bu, uygulamanın HTTP yanıtındaki komuttan çıktı döndürmediği anlamına gelir. Bu zafiyetten faydalanmak için “zaman gecikmesi (time delay)”, “çıktı yönlendirme” gibi farklı teknikler gereklidir. Bu teknikleri başka bir yazımda ele alacağım.

4- Örnek Bir Atak Senaryosu

Kullanıcının bir mağazadaki ürünlerin stokta bulunup bulunmadığını görmesini sağlayan bir alışveriş uygulaması olsun ve bu bilgilere aşağıdaki gibi bir URL ile erişilsin:

https://guvensiz-magaza.com/stokDurumu?urunID=245&magazaID=38

Bu noktada uygulamanın, eski kayıtları sorgulaması gerekeceğinden ötürü ürün ve mağaza ID’lerini bir kabuk komutuna bağımsız değişken olarak ilettiğini düşünelim.

stokdurum.pl 245 38 gibi

Geliştirici, komut enjeksiyonuna karşı hiçbir önlem almadığı için saldırgan, istediği bir komutu yürütmek amacıyla aşağıdaki gibi bir girdi gönderebilir:

& echo bu_zararli_bir_komuttur &

Bu girdi urunID parametresinde gönderilirse, uygulama tarafından yürütülen komut şu şekilde olacaktır:

stokdurum.pl & echo bu_zararli_bir_komuttur & 38

Echo komutu, verilen dizenin çıktıda görülmesini sağlamakla beraber komut enjeksiyonlarını tespit etmek için kullanışlı bir yöntemdir. & Karakteri bir kabuk komut ayırıcısıdır ve dolayısıyla yürütülen şey aslında birbiri ardına üç ayrı komuttur. Sonuç olarak, kullanıcıya döndürülen çıktı şöyle olacaktır:

Hata -urunID bulunamadı

bu_zararli_bir_komuttur

38: komut bulunamadı

Peki burada ne oldu?

4.1- stokdurum.pl dosyası, beklediği bağımsız değişkenler olmadan komutu yürüttü ve bu nedenle bir hata iletisi döndürdü.

4.2- Enjekte edilen echo komutu yürütüldü ve saldırganın girdiği ifade ekrana basıldı.

4.3- Özgün argüman olan 38, hataya neden olan bir komut olarak yürütüldü.

Alınabilecek Önlemler

1- İzin verilen değerlerin bulunduğu bir beyaz liste oluşturmak.

2- Girdinin bir sayı olduğunu doğrulamak.

3- Girdinin yalnızca alfanumerik karakterler içerdiğini/başka bir sözdizimi veya boşluk içermediğini doğrulamak.

 

Ahmet Ümit BAYRAM / Medium

(root)