Bu yazımızda sizlere SSTI nedir, etkileri ve SSTI saldırısı nasıl yapılır ve buna karşı nasıl önlemler almanız gerektiğini anlatacağız.
Server side template injection kelimelerinin kısaltması olan SSTI, saldırganların server tarafında kullanılan yerel şablonlarına kötü niyetli komutları yürütebilen girdi eklendiği bir güvenlik açığıdır. Şablon motoruna geçersiz kullanıcı girişi yerleştirildiği zaman yani giriş doğrulaması düzgün işlenmediğinde güvenlik açığı oluşur ve bu da uzaktan kod yürütülmesine (RCE) neden olabilir.
Kullanıcılar, ürünler, sonuç çıktıları hakkında bilgileri görüntülemek için kullanılan şablon motorları(template engine), dinamik verileri web sayfalarına yerleştiren sonuçların üretilmesi için şablonları bir veri modeliyle birleştirir. MVC (Model View Controller) sisteminde Model – View – Controller’dan oluşan 3 adet katman bulunur. Bu süreç kullanıcı isteği ile başlar controller → model → controller → view → çıktı ile sonlanmaktadır.
En popüler şablon motorları;
- PHP – Smarty, Twigs
- Java – Velocity, Freemaker
- Python – JINJA, Mako, Tornado
- JavaScript – Jade, Rage
- Ruby – Liquid
SSTI (Sunucu tarafı şablon ekleme) sonucu oluşan güvenlik açıkları genellikle kritiktir ve back end sunucusunun tüm kontrolünü ele geçirerek uzaktan kod yürütülmesine neden olur. (RCE) Kod yürütülmese de, saldırgan sunucuda bulunan hassas verileri elde eder. Şablon motorunuza bağlı olarak, bir SSTI güvenlik açıkları her zaman kritik olmayabilir.
Yani bu güvenlik açıkları, şablon motoruna ve uygulamanın şablon motorunu nasıl kullandığına bağlı olarak web siteleri çeşitli saldırılara uğrayabilir.
Saldırgan back end serverının tam kontrolünü ele geçirerek ve onu dahili altyapı üzerinde başka saldırılar gerçekleştirerek uzaktan kod yürütmeyi başarabilir.
Özetle tam uzaktan kod yürütmenin mümkün olmadığı durumlarda bile, bir saldırgan genellikle çok sayıda başka saldırının temeli olarak SSTI kullanmayı sürdürebilir ve potansiyel olarak sunucudaki hassas verilere ve rastgele dosyalara okuma erişimi elde edebilir.
Güvenlik Açığı Nasıl Belirlenir?
SSTI güvenlik açıklarını belirlemek için, şablonu bulanıklaştırmak için şablonlarda sık sık kullanılan özel karakterlerden oluşan Polyglot yükü kullanın.
Bir güvenlik açığı durumunda, bir hata mesajı dönebilir veya sunucu tarafından istisna oluşturulabilir.
Güvenlik açığını belirlemek için yapmanız gerekenler:
- Şablon eklemesinin nerede olduğunu bulun.
- Şablon motorunu tanımlayın ve güvenlik açığını doğrulayın
- Belirli şablon motoru için kılavuzları takip edin
- Güvenlik açığını kullanın
Örnek şablon:
Güvenlik açıkları özellikle login, register, password reset, search, file upload, URL, header başlıklarında bulunmaktadır. Güvenlik açığı testinde ilk öncelik inputlar, url ve başlıklardır. Güvenlik açıklarıdaha önce de bahsettiğimiz gibi kullandığınız şablon motorlarına göre değişiklik göstermektedir.
SSTI Saldırısı
Sunucu tarafı şablon ekleme saldırınlarında başarılı bir saldırı planı oluşturmak için yapmanız gerekenler;
- Tespit etmek: Plaintext context
- Tanılamak: Code context
- Açığa çıkarmak
- Oku
- Araştır
- Saldır
Payload(Yük) Seçimi?
Şablon motorlarının kullandığı yazılım dilleri yük seçimini etkiler. Örneğin;
- TWIG ile “id” komutu çalıştırmak için ;
{{_self.env.registerUndefinedFilterCallback(“exec”)}}{{_self.env.getFilter(“id”)}} - SMARTY ile “id” komutu çalıştırmak için ;
{php}echo system(“id”);{/php} - Freemarker ile “id” komutu çalıştırmak için ;
<#assign ex = “freemarker.template.utility.Execute”?new()>${ ex(“id”)} - Mako ile “id” komutu çalıştırmak için ;
<% import os
x=os.popen(‘id’).read()
%>
${x} - Kısaca her bir şablon motoru için programlama diline göre farklı payload seçilir.
Server Side Template Injection saldırıları için Tplmap aracı en kullanışlı tool olarak görülmektedir. Bu aracın desteklediği şablon motorlarının listesine kendi Github Sayfası üzerinde bulabilirsiniz.
SSTI güvenlik açıkları nasıl önlenir?
- Yapmanız gereken en iyi yol hiçbir kullanıcının yeni şablonları değiştirmesine veya göndermesine izin vermemektir.
- Temizleme yapın. Herhangi bir kötü amaçlı yazılımdan kaynaklanan güvenlik açıklarını en aza indirmek için kullanıcı girişini şablonlara aktarmadan kontrol edin ve temizleyin.
- Riskli karakterler kullandığınızda sandbox kullanabilirsiniz.
- En basit yol ise Mustache gibi “mantıksız” bir şablon motoru kullanmaktır.
- Kullanıcı kodunu yalnızca potansiyel olarak tehlikeli olan ve işlevlerin tamamen kaldırıldığı korumalı bir ortamda yürütün.
- Son olarak, şablonunuzu kilitli bir Docker konteynırında dağıtarak kendi korumalı alanınızı yaratın.