SSTI (Server Side Template Injection)
Last updated
Last updated
https://miro.medium.com/v2/resize:fit:640/format:webp/1*3RO051EgizbEer-mdHD8Kg.jpeAWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
RootedCON İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplinde teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
Sunucu tarafı şablon enjeksiyonu, bir saldırganın sunucuda yürütülen bir şablona kötü niyetli kod enjekte edebilmesi durumunda meydana gelen bir güvenlik açığıdır. Bu güvenlik açığı, Jinja dahil olmak üzere çeşitli teknolojilerde bulunabilir.
Jinja, web uygulamalarında kullanılan popüler bir şablon motorudur. Jinja kullanarak bir güvenlik açığına sahip kod parçasını gösteren bir örneği ele alalım:
Bu savunmasız kodda, kullanıcının isteğinden gelen name
parametresi doğrudan render
fonksiyonu kullanılarak şablona aktarılmaktadır. Bu, bir saldırganın name
parametresine kötü niyetli kod enjekte etmesine olanak tanıyabilir ve bu da sunucu tarafı şablon enjeksiyonuna yol açabilir.
Örneğin, bir saldırgan şu şekilde bir yük ile bir istek oluşturabilir:
The payload {{bad-stuff-here}}
name
parametresine enjekte edilir. Bu yük, saldırganın yetkisiz kod çalıştırmasına veya şablon motorunu manipüle etmesine olanak tanıyan Jinja şablon direktiflerini içerebilir ve potansiyel olarak sunucu üzerinde kontrol kazanabilir.
Sunucu tarafı şablon enjeksiyonu zafiyetlerini önlemek için, geliştiricilerin kullanıcı girdisinin şablonlara eklenmeden önce düzgün bir şekilde temizlendiğinden ve doğrulandığından emin olmaları gerekir. Girdi doğrulaması uygulamak ve bağlama duyarlı kaçış teknikleri kullanmak, bu zafiyetin riskini azaltmaya yardımcı olabilir.
Sunucu Tarafı Şablon Enjeksiyonu (SSTI) tespit etmek için, başlangıçta şablonu fuzzing yapmak basit bir yaklaşımdır. Bu, şablona özel karakterlerin bir dizisini (${{<%[%'"}}%\
) enjekte etmeyi ve sunucunun normal verilerle bu özel yük arasındaki yanıt farklılıklarını analiz etmeyi içerir. Zafiyet göstergeleri şunlardır:
Zafiyeti ve potansiyel olarak şablon motorunu ortaya çıkaran hatalar.
Yansımada yükün yokluğu veya bazı kısımlarının eksik olması, sunucunun bunu normal verilerden farklı işlediğini ima eder.
Düz Metin Bağlamı: Sunucunun şablon ifadelerini değerlendirip değerlendirmediğini kontrol ederek XSS'ten ayırt edin (örneğin, {{7*7}}
, ${7*7}
).
Kod Bağlamı: Girdi parametrelerini değiştirerek zafiyeti doğrulayın. Örneğin, http://vulnerable-website.com/?greeting=data.username
içindeki greeting
değerini değiştirerek sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu görmek için greeting=data.username}}hello
gibi bir değer döndürüp döndürmediğine bakın.
Şablon motorunu tanımlamak, hata mesajlarını analiz etmeyi veya çeşitli dil spesifik yükleri manuel olarak test etmeyi içerir. Hatalara neden olan yaygın yükler arasında ${7/0}
, {{7/0}}
ve <%= 7/0 %>
bulunur. Matematiksel işlemlere sunucunun yanıtını gözlemlemek, belirli şablon motorunu belirlemeye yardımcı olur.
Daha fazla bilgi için https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
yenilikçi poliglotlar kullanan etkili bir SSTI + CSTI tarayıcısıdır.
en etkili şablon enjeksiyonu poliglotlarını ve 44 en önemli şablon motorunun beklenen yanıtlarını içeren etkileşimli bir tablo.
Bu wordlist içinde aşağıda belirtilen motorların bazı ortamlarında tanımlı değişkenler bulabilirsiniz:
Java - Temel enjeksiyon
Java - Sistemin ortam değişkenlerini al
Java - /etc/passwd'ı Al
Payload'larınızı https://try.freemarker.apache.org adresinde deneyebilirsiniz.
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (eski)
${7*'7'} Hiçbir şey
${foobar}
Freemarker - Sandbox atlatma
⚠️ yalnızca 2.3.30'dan önceki Freemarker sürümlerinde çalışır
Daha fazla bilgi
https://portswigger.net/research/server-side-template-injection adresindeki FreeMarker bölümünde
Daha fazla bilgi
https://portswigger.net/research/server-side-template-injection adresindeki Velocity bölümünde
Thymeleaf'de, SSTI zafiyetleri için yaygın bir test ifadesi ${7*7}
'dir; bu, bu şablon motoru için de geçerlidir. Potansiyel uzaktan kod yürütme için aşağıdaki gibi ifadeler kullanılabilir:
SpringEL:
OGNL:
Thymeleaf, bu ifadelerin belirli nitelikler içinde yer almasını gerektirir. Ancak, ifade iç içe geçirme diğer şablon konumları için desteklenir ve [[...]]
veya [(...)]
gibi sözdizimi kullanır. Bu nedenle, basit bir SSTI test yükü [[${7*7}]]
gibi görünebilir.
Ancak, bu yükün çalışması olasılığı genellikle düşüktür. Thymeleaf'in varsayılan yapılandırması dinamik şablon oluşturmayı desteklemez; şablonlar önceden tanımlanmış olmalıdır. Geliştiricilerin, şablonları anlık olarak dizelerden oluşturmak için kendi TemplateResolver
'larını uygulamaları gerekir, bu da yaygın değildir.
Thymeleaf ayrıca, çift alt çizgi içinde (__...__
) bulunan ifadelerin ön işleme tabi tutulduğu ifade ön işleme sunar. Bu özellik, Thymeleaf'in belgelerinde gösterildiği gibi, ifadelerin inşasında kullanılabilir: