PortSwigger Server-side template injection
Server-side template injection, saldırganın bir template’e zararlı bir komut enjekte etmek için template’in syntax’ini kullanmasıdır.
Template engine’ler sabit template’leri değişken verilerle değiştirerek web sayfaları oluşturmak için tasarlanmıştır. Server-side template injection saldırıları, kullanıcıdan alınan inputları doğrulamadan direkt template ile birleştiği durumlarda gerçekleşir. Saldırgan template engine’i manipüle ederek sunucunun tam kontrolünü ele geçirebilir.
Lab 1 Lab 2 Lab 3 Lab 4 Lab 5 Lab 6 Lab 7
Lab-1 Basic server-side template injection
Bu laboratuvarda ERB template’inin doğru yapılandırılmamasından kaynaklı server-side template injection güvenlik zafiyeti bulunmaktadır. Lab’ın tamamlanması için Carlos’un homa dizininden morale.txt silinmelidir.
Uygulamadaki “message” parametresi alınan inputu kullanıcıya geri yansıtmaktadır. Potansiyel bir SSTI zafiyeti oluşabilir.
Uygulama ERB template kullandığı bilindiğinden ilgili payload parametre ile gönderilmektedir. 49 yanıtı, template engine’in inputu işleyerek çıkan sonucu yazdırdığını göstermektedir.
Böylelikle istenilen komut yürütülebilir ve carlos dizini altındaki morale.txt silinebilir.
Lab-2 Basic server-side template injection (code context)
Bu laboratuvarda Tornado template’inin güvenli olmayan şekilde kullanılmasından kaynaklı server-side template injection güvenlik zafiyeti bulunmaktadır. Lab’ın tamamlanması için Carlos dizini altındaki morale.txt dosyasını silen bir SSTI saldırısı gerçekleştirilmelidir.
Kullanıcı profilinde nickname veya isim olarak gezinme ayarı bulunmakta. Bu ayar değiştirildiğinde input kullanıcıya geri yansıtılmaktadır. Aşağıdaki görselde zafiyetin tespiti için gerekli payload görüntülenmektedir.
Payload sunucu tarafında hata vermektedir.
Template engine python tabanlı olduğundan süslü parantezler ile bir ifade yazıldıktan sonra payload yazılmaktadır.
Bu deneme başarı olup 49 değerini görüntülenmektedir.
Sunucu üzerinde işletim sistemi komutu çalıştıracak ve carlos dizini altındaki morale.txt dosyasını silecek payload gönderilerek lab tamamlanmaktadır.
Lab-3 Server-side template injection using documentation
Bu laboratuvarda server-side template injection güvenlik zafiyeti bulunmaktadır. Lab’ın tamamlanması için template engine’in tespit edilmesi ve keyfi komut çalıştırarak hedef sunucuda bulunan Carlos dizini altındaki morale.txt dosyasının silinmesi gerekmektedir.
Uygulamadaki ürünlerin açıklama kısmını değiştirebilmekteyiz. ${deneme} gibi bir tanım denendiğinde uygulama hata vermektedir ve hata mesajında template engine’in FreeMarker olduğu görüntülenmektedir.
FreeMarker dökümanlarında okuma yaparak hedef işletim sistemi üzerinde morale.txt dosyasını silmeye yarayan komut oluşturulmaktadır.
Lab-4 Server-side template injection in an unknown language with a documented exploit
Bu laboratuvarda server-side template injection güvenlik zafiyeti bulunmaktadır. Lab’ın tamamlanması için template engine’in tespit edilip carlos dizini altında bulunan morale.txt dosyasının silinmesi gerekmektedir.
Uygulamada bulunan message parametresi üzerinde random payload’lar deneyerek bir hata mesajı elde edilmektedir. Hata mesajında template engine’in handlebars olduğu görüntülenmektedir.
Handlebars hakkında araştırma yapılarak aşağıdaki görselde görüntüleneceği üzere işletim sistemi üzerinde komut yürütme payload’ına erişilmektedir.
URL encoding yaparak ilgili payload sunucuya gönderildiğinde lab tamamlanmaktadır.
Lab-5 Server-side template injection with information disclosure via user-supplied objects
Bu laboratuvarda server-side template injection güvenlik zafiyeti bulunmaktadır. Bu güvenlik zafiyeti hassas verileri ifşa etmektedir. Lab’ın tamamlanması için framework’ün secret key bilgisi elde edilmelidir.
Çeşitli payload’lar denenerek hata mesajı alınmaktadır ve hata mesajında kullanılan template tespit edilmektedir.
Django’da secret key verisini alabilemek için aşağıdaki kod yazılmaktadır.
Lab-6 Server-side template injection in a sandboxed environment
Bu laboratuvar Freemarker Template engine kullanmaktadır. Laboratuvarda sandbox’un yanlış yapılandırılmasından kaynaklı server-side template injection güvenlik zafiyeti bulunmaktadır. Lab’ın tamamlanması için sandbox’un atlatılıp carlos dizini altındaki my_password.txt dosyasının okunması gerekmektedir.
Template engine’in Freemarker oldu bilindiğinden araştırma yapıldığında Sandbox bypass adı altında bir payload bulunmaktadır.
Uygulamanın default olarak verdiği text’te daha önce article’ın product olduğu görüntülenmişti ilgili payload düzenlenerek hedef uygulamaya gönderilmektedir ve id verisi okunmaktadır.
Lab’ın istediği parola dosyasının okunması için payload düzenlenerek tekrar gönderilmektedir.
Lab-7 Server-side template injection with a custom exploit
Bu laboratuvarda server-side template injection güvenlik zafiyeti bulunmaktadır. Lab’ın tamamlanması için carlos dizinindeki /.ssh/id_rsa dosyasının silinmesi gerekmektedir.
Uygulamada avatar yükleme fonksiyonu bulunmaktadır ve invalid bir dosya gönderildiğinde aşağıdaki hata mesajı alınmaktadır. Bu hata mesajı bize User.setAvatar() fonksiyonu gibi güzel bir ipucu vermektedir.
Daha sonrasında uygulamada bulunan lakap-gerçek isim değiştirme requesti incelendiğinde user.setAvatar’ı kullanılabilecek potansiyel bir input alanı gözlenmektedir. /etc/passwd dosyasının okunması için payload oluşturulmaktadır.
Daha sonra wiener kullanıcısının avatarına gidildiğinde /etc/passwd dosyası görüntülenmektedir.
Carlos kullanıcısının id_rsa verisini okumak için payload düzenlenmektedir.
Laboratuvar bizden dosyanın silinmesini istemektedir. İlk görseldeki hata mesajında elde ettiğimiz User.php dosyasının içeriği incelendiğinde gdprDelete() isimli bir fonksiyon tespit edilmiştir. Bu fonksiyon avatar’ı silmektedir. Avatar, carlos kullanıcısının id_rsa dosyası olarak az önceki gibi ayarlanıp gdprDelete() fonksiyonu çağırıldığında id_rsa dosyası silinmektedir.