- Katılım
- 3 Ocak 2026
- Mesajlar
- 2
- Tepkime puanı
- 4
- Puan
- 3
Giriş
Web uygulamalarının yaygınlaşmasıyla birlikte güvenlik ihtiyacı da artmıştır. Bu yazıda, web güvenliğinde sıkça karşılaşılan iki kritik zafiyeti inceleyeceğiz: SSTI (Server-Side Template Injection) ve CSTI (Client-Side Template Injection).SSTI (Server-Side Template Injection)
SSTI, kullanıcıdan alınan verilerin sunucu taraflı şablon motorlarına filtrelenmeden iletilmesi sonucu oluşur. Geliştirici, kullanıcı girdisini doğrudan şablon motoruna işlerse; saldırgan bu alana zararlı ifadeler enjekte ederek motorun yorumlama yeteneğini kötüye kullanabilir.Bu zafiyet, sunucudaki hassas verilerin okunmasından sunucunun tamamen ele geçirilmesine (RCE) kadar varan ciddi sonuçlar doğurabilir.
Hangi Teknolojilerde Görülür?
SSTI, aşağıdaki sunucu taraflı şablon motorlarında yaygındır:
Python: Jinja2, Mako
PHP: Twig, Smarty
Java: Freemarker, Velocity
Ruby: Liquid
Bu motorlar genellikle {% %}, {{ }} gibi özel sözdizimleri (syntax) ile verileri işler.
Örnek Senaryo Bir web uygulamasında aşağıdaki gibi bir URL yapısı olduğunu varsayalım:http://localhost:5000/?name=Emirhan
Normal şartlarda sayfa "Merhaba Emirhan" çıktısı verir. Ancak saldırgan şablon motorunu tetikleyen bir matematiksel işlem gönderirse:http://localhost:5000/?name={{7*7}}
Şablon motoru bu ifadeyi işler ve sayfada şu yanıt döner:Merhaba 49!
Bu durum, sunucunun kodu derlediğini ve SSTI zafiyetinin varlığını kanıtlar.
CSTI (Client-Side Template Injection)
CSTI, modern frontend framework'lerinde kullanıcı girdilerinin gerekli sanitizasyon (temizleme) yapılmadan işlenmesiyle ortaya çıkar. Bu zafiyet, tarayıcı tarafında zararlı JavaScript kodlarının çalıştırılmasına yol açabilir.CSTI sıkça XSS (Cross-Site Scripting) ile karıştırılır; ancak temel fark, CSTI'nın doğrudan framework'ün şablon sözdizimini hedef almasıdır.
Hangi Teknolojilerde Görülür?
- AngularJS
- Vue.js
- Mustache
- Handlebars.js
<div>{{ username }}</div>
Eğer saldırgan, kullanıcı adı olarak bir "sandbox escape" payload'ı gönderirse:{ "username": "{{constructor.constructor('alert(1)')()}}" }
AngularJS bu ifadeyi yorumlar ve tarayıcıda alert(1) kodunu çalıştırır. Bu açık; oturum (cookie) çalma, DOM manipülasyonu veya keylogger yerleştirme gibi saldırılara zemin hazırlar.
Uygulamalı SSTI Zafiyeti Örneği (Flask + Jinja2)
Uygulamamız;

İlk olarak tarayıcıya bu URL’yi girerek davranışı gözlemliyoruz:
http://localhost:5000/?name=Emirhan
Sonuç;

Ama aşağıdaki gibi bir payload gönderirsek;
http://localhost:5000/?name={{7*7}}

Bu, SSTI zafiyetinin aktif olduğunu gösterir.
Güvensiz CSTI Örneği
Şimdi, escape işlemi yapılmadan kullanıcıdan alınan girdinin şablon motoruna nasıl doğrudan verileceğini ve bunun sonucunda CSTI zafiyetinin nasıl exploit edileceğini gösterelim.
Kodumuz;

Urlmiz;
http://127.0.0.1:5000/?input=<script>alert('CSTI Zafiyeti!’);</script>

Bu, CSTI zafiyetinin nasıl exploit edilebileceğini gösteriyor. Kullanıcıdan alınan input doğrudan şablona yerleştirildiği için, zararlı JavaScript kodu çalıştırılabiliyor.
Bu yazıda, SSTI ve CSTI zafiyetlerinin ne olduğunu, nasıl exploit edilebileceğini ve bunlardan nasıl korunmamız gerektiğini detaylı bir şekilde inceledik. Bu tür güvenlik açıkları, web uygulamalarının güvenliğini tehdit eden önemli risklerdir ve her geliştiricinin dikkat etmesi gereken konulardır.
Umarım bu yazı, hem güvenlik açıklarını anlamanızı hem de pratikte nasıl çözebileceğiniz konusunda size yardımcı olmuştur. Unutmayın, güvenli yazılım geliştirme her zaman önceliğimiz olmalıdır!
Emirhan Sevmez.