OS komut enjeksiyonu ayrıca kabuk enjeksiyonu olarak da bilinir, bir saldırganın bir uygulamayı çalıştıran sunucuda rastgele işletim sistemi (OS) komutları yürütmesine ve genellikle uygulamanın ve tüm verilerinin güvenliğinin tamamen tehlikeye girmesine izin veren bir web güvenlik açığıdır. Çoğu zaman, bir saldırgan, saldırıyı kuruluş içindeki diğer sistemlere yönlendirmek için güven ilişkilerinden yararlanarak barındırma altyapısının diğer bölümlerini tehlikeye atmak için bir işletim sistemi komut enjeksiyon güvenlik açığından yararlanabilir.
İsteğe bağlı komutları yürütme
Kullanıcının belirli bir mağazada bir ürünün stokta olup olmadığını görmesini sağlayan bir alışveriş uygulaması düşünün. Bu bilgilere aşağıdaki gibi bir URL aracılığıyla erişilir:
Stok bilgilerini sağlamak için uygulamanın çeşitli eski sistemleri sorgulaması gerekir. Tarihsel nedenlerden dolayı, işlevsellik, ürün ve mağaza kimlikleriyle birlikte bir kabuk komutuna argüman olarak çağrılarak uygulanır:
Bu komut, kullanıcıya iade edilen belirtilen kalemin stok durumunu verir.
Uygulama, işletim sistemi komut enjeksiyonuna karşı hiçbir savunma uygulamadığından, bir saldırgan, rastgele bir komut yürütmek için aşağıdaki girdiyi gönderebilir:
Bu giriş, ürün kimliği parametresinde gönderilirse, uygulama tarafından yürütülen komut şudur:
echo komutu, sağlanan dizenin çıktıda yankılanmasına neden olur ve bazı işletim sistemi komut enjeksiyonu türlerini test etmenin kullanışlı bir yoludur. & karakteri bir kabuk komut ayırıcısıdır ve bu nedenle yürütülen şey aslında birbiri ardına üç ayrı komuttur. Sonuç olarak, kullanıcıya çevrilen çıktı:
Üç çıktı satırı şunu gösterir:
- Orijinal
stockreport.pl
komutu, beklenen bağımsız değişkenler olmadan yürütüldü ve bu nedenle bir hata mesajı verdi. - Enjekte edilen echo komutu yürütüldü ve sağlanan dize çıktıda yankılandı.
- Orijinal argüman 29, bir hataya neden olan bir komut olarak yürütüldü.
Ek komut ayırıcısını & enjekte edilen komuttan sonra yerleştirmek, enjekte edilen komutu enjeksiyon noktasını takip edenlerden ayırdığı için genellikle yararlıdır. Bu, aşağıdakilerin enjekte edilen komutun yürütülmesini engelleme olasılığını azaltır.
Faydalı komutlar
Bir işletim sistemi komut ekleme güvenlik açığı belirlediğinizde, tehlikeye attığınız sistem hakkında bilgi almak için bazı başlangıç komutlarını yürütmek genellikle yararlıdır. Aşağıdaki tabloda, Linux ve Windows platformlarında yararlı olan bazı komutların bir özeti verilmiştir:
Kör OS komut enjeksiyon güvenlik açıkları
İşletim sistemi komut enjeksiyonunun birçok örneği, kör güvenlik açıklarıdır. Bu, uygulamanın komuttan çıktıyı HTTP yanıtı içinde döndürmediği anlamına gelir. Kör güvenlik açıklarından yararlanmaya devam edilebilir, ancak farklı teknikler gereklidir.
Kullanıcıların site hakkında geri bildirim göndermesine izin veren bir web sitesi düşünün. Kullanıcı e-posta adresini ve geri bildirim mesajını girer. Sunucu tarafı uygulaması daha sonra site yöneticisine geri bildirimi içeren bir e-posta oluşturur. Bunu yapmak için, gönderilen ayrıntılarla birlikte mail programına seslenir. Örneğin:
Eğer mail komutunun çıktısı varsa, uygulamanın yanıtlarında döndürülmez ve bu nedenle echo yükünü kullanmak etkili olmaz. Bu durumda, bir güvenlik açığını tespit etmek ve kullanmak için çeşitli başka teknikler kullanabilirsiniz.
Zaman gecikmelerini kullanarak kör OS komut enjeksiyonunu algılama
Uygulamanın yanıt vermesi için geçen süreye bağlı olarak komutun yürütüldüğünü onaylamanıza olanak tanıyan, bir zaman gecikmesini tetikleyecek enjekte edilmiş bir komut kullanabilirsiniz. Ping komutu, gönderilecek ICMP paketlerinin sayısını ve dolayısıyla komutun çalışması için geçen süreyi belirtmenize izin verdiği için bunu yapmanın etkili bir yoludur:
Bu komut, uygulamanın 10 saniye boyunca geri döngü ağ bağdaştırıcısına ping atmasına neden olur.
Çıktıyı yeniden yönlendirerek kör işletim sistemi komut enjeksiyonunu kullanma
Çıktıyı enjekte edilen komuttan web kökü içindeki bir dosyaya yönlendirebilir ve daha sonra tarayıcınızı kullanarak alabilirsiniz. Örneğin, uygulama /var/www/static
dosya sistemi konumundan statik kaynaklar sunuyorsa, aşağıdaki girişi gönderebilirsiniz:
The>character, whoami komutundan çıktıyı belirtilen dosyaya gönderir. Ardından, dosyayı almak için dosyasını almak için tarayıcınızı kullanabilir ve enjekte edilen komuttan çıktıyı görüntüleyebilirsiniz.
Bant dışı (OAST) teknikleri kullanarak kör OS komut enjeksiyonu kullanma
OAST tekniklerini kullanarak, kontrol ettiğiniz bir sistemle bant dışı ağ etkileşimini tetikleyecek enjekte edilmiş bir komut kullanabilirsiniz. Örneğin:
Bu yük, belirtilen etki alanı için bir DNS aramasına neden olmak için nslookup komutunu kullanır. Saldırgan, belirtilen aramanın gerçekleştiğini izleyebilir ve böylece komutun başarıyla enjekte edildiğini algılayabilir.
Bant dışı kanal ayrıca enjekte edilen komutlardan çıktıyı sızdırmak için kolay bir yol sağlar:
Bu, whoami komutunun sonucunu içeren saldırganın etki alanına bir DNS aramasına neden olur:
İşletim sistemi komutlarını enjekte etme yolları
OS komut enjeksiyonu saldırılarını gerçekleştirmek için çeşitli kabuk metakarakterleri kullanılabilir. Bir dizi karakter, komut ayırıcılar olarak işlev görür ve komutların birlikte zincirlenmesine izin verir. Aşağıdaki komut ayırıcılar hem Windows hem de Unix tabanlı sistemlerde çalışır:
- &
- &&
- |
- ||
Aşağıdaki komut ayırıcılar yalnızca Unix tabanlı sistemlerde çalışır:
- ;
- Yeni satır (0x0a veya \n)
Unix tabanlı sistemlerde, orijinal komut içinde enjekte edilen bir komutun satır içi yürütülmesini gerçekleştirmek için ters tik veya dolar karakterini de kullanabilirsiniz:
- ` enjekte edilen komut `
- $ ( enjekte edilen komut )
Farklı kabuk meta karakterlerinin, belirli durumlarda çalışıp çalışmadıklarını ve komut çıktısının bant içi alınmasına izin verip vermediklerini veya yalnızca kör sömürü için yararlı olup olmadıklarını etkileyebilecek çok farklı davranışları olduğunu unutmayın.
Bazen, kontrol ettiğiniz girdi orijinal komutta tırnak işaretleri içinde görünür. Bu durumda, yeni bir komut enjekte etmek için uygun kabuk meta karakterlerini kullanmadan önce alıntılanan bağlamı (” veya ‘ kullanarak) sonlandırmanız gerekir.
OS Komut Enjeksiyonu Saldırıları Nasıl Önlenir?
İşletim sistemi komut ekleme güvenlik açıklarını önlemenin açık ara en etkili yolu, uygulama katmanı kodundan hiçbir zaman işletim sistemi komutlarını çağırmamaktır. Hemen hemen her durumda, daha güvenli platform API’lerini kullanarak gerekli işlevselliği uygulamanın alternatif yolları vardır.
Kullanıcı tarafından sağlanan girdiyle işletim sistemi komutlarının çağrılmasının kaçınılmaz olduğu düşünülüyorsa, güçlü girdi doğrulaması gerçekleştirilmelidir. Etkili doğrulamanın bazı örnekleri şunları içerir:
- İzin verilen değerlerin beyaz listesine göre doğrulama.
- Girişin bir sayı olduğunu doğrulama.
- Girişin yalnızca alfasayısal karakterler içerdiğini, başka bir sözdizimi veya boşluk içermediğini doğrulama.
Girişi kabuk metakarakterlerinden kaçarak temizlemeye çalışmayın. Pratik olarak, bu hataya çok açıktır ve yetenekli bir saldırgan tarafından atlanmaya karşı savunmasızdır.