Server-Side Template Injection

Enistein

Kıdemli Üye
16 Eyl 2012
2,222
1,227
Amsterdam
Merhabalar, Sizlere bugün Server-Side Template Injection'dan bahsedeceğim.

Server-Side Template Injection modern web uygulamalarının MVC(Model View Controller) ve MVT( Model View Template) tabanlı yapılara yönelmesiyle ve bu yapıların doğru yönetilmemesiyle oluşan bir güvenlik zaafiyetidir.

Bu yapıların işleyişinden çok detaylı bahsetmeyeceğim. Fakat eğer ilginizi çekerse konuya sorularınızı atarsanız cevaplarım.

Saldırganları ilgilendiren taraf nedir?
Bu yapılar genel olarak html, js, vb. gibi standart bir web formunun içerisinde yer alan komponentleri backend tarafında renderlayıp, frontende iletmesiyle bilinirler. Örneğin siz bir kullanıcı olarak bir alışveriş sitesine kayıt oldunuz ve yorum yaptınız. Sizin yorumunuz frontend içerisinde {{comment}} belirli ayraçlar ile değişken olarak tutulur. Daha sonrasında backend bunu renderlarken ayraçları kontrol eder ve içerisinde yer alan değişkeni veritabanından, backendden veya nerede tutuyorsa oradan getirir ve frontende {{comment}} yerine "x kişisinin yorumu" şeklinde frontende iletir.

mSHIg3p.png

(Django ile sabit bir değişkenin Template Engine sürecinden geçmesi.)

Yani aslında burada tek bir html sayfası(Template) mevcuttur. Fakat dinamik olarak kullanıcının girdilerine göre backend tarafında html sayfası şekillendirilir ve frontende iletilir. Renderlama işini yapan aracı Template Engine olarak adlandırırız.

Eğer bu işlemler yapılırken arada hiç bir filtreleme, sanitized işlemi yapılmadan kullanıcı girdileri template içerisine gömülürse, saldırganlar girdileri şekillendirerek farklı saldırı vektörleri hazırlayabilir.

Bazı Template Engin 'ler:

Python - Jinja2, Mako, Django Templates
JavaScript - Handlebars, Mustache, EJS
PHP - Twig, Smarty, Blade
Java - Thymeleaf, FreeMarker, Velocity
.Net - Razor, WebForms
Ruby - ERB (Embedded Ruby), Haml, Slim
Go - html/template
Perl - Mason
Rust - Handlebars, Tera

SSTI Saldırı Vektörleri:
  1. Veritabanı erişimi: Saldırganlar uygulamanın arkasındaki veritabanına erişebilir ve özel bilgileri çalabilir veya değiştirebilir.
  2. Command Injection: Saldırganlar uygulamanın arkasındaki sisteme komutlar göndererek, sistemi kontrol edebilir veya zararlı kod yükleyebilir.
  3. File Injection: Saldırganlar uygulamanın arkasındaki sistemde dosyalara erişebilir veya dosyaları değiştirebilir.
  4. Arbitrary File Read: Saldırganlar uygulamanın arkasındaki sistemdeki dosyaları okuyabilir, özellikle sensetive veya kritik dosyalar.
  5. Remote Code Execution: Saldırganlar uygulamanın arkasındaki sistemdeki kodları çalıştırabilir veya zararlı kod yükleyebilir.
  6. Denial of Service (DoS) saldırıları: Saldırganlar uygulamayı yavaşlatabilir, kilitleyebilir veya kullanılamaz hale getirebilir.
  7. Session hijacking: Saldırganlar uygulama içerisindeki session tokenleri çalabilir ve kullanıcının kimliğini suistimal edebilir.
Örnek Bir Saldırı Vektörü:
PortSwigger üzerinde yer alan lablardan örnek bir saldırı vektörü uygulayalım.
waPpsf1.png

Buradaki laba göre hedef websitede ERB Template engine bulunuyor. Bizden Server-Side Template Injection yöntemi ile sunucuda yer alan morale.txt dosyasını silmemizi istiyor. ERB yapısının ve template taglarinin kullanımına buradan bakabilirsiniz.

jr6E2fm.png

Burp suite ile sayfalarda dolaştıktan sonra istek atılan yerleri kontrol ettiğimde message parametresi alan bir url adresi buldum. Buraya aynı XSS' de yer aldığı gibi verdiğim komutları html içerisine basıyor.
hsyIHZ8.png

dedimki:<%=7*7%>%20Mentalistler şeklinde parametreye bir payload gönderdiğimde, ERB template tagını alıyor ve sonuç olarak bize 7*7'nin sonucunu yani 49'u döndürüyor. Yani burada bir SSTI zaafiyeti olduğunu tespit etmiş olduk.
z81hv5Q.png

<%= File.open('/etc/passwd').read %> payloadını yazarak /etc/passwd dosyasına erişmiş olduk. Sadece örnek bir kullanım için bu adımı gösterdim.

Txx3caP.png

Şimdi lab'ın bizden yapmamızı istediği görev için morale.txt dosyasını silmemiz gerekiyor. Bunun için <%= system('rm morale.txt') %> payloadını çalıştırdım ve bana true olarak yanıt döndürdü. Ardından PortSwigger bu labı çözdüğümüzün bildirimini verdi. Yazmış olduğumuz payload içerisinde os komutu çalıştırdık ve rm komutu ile morale.txt dosyasının silinmesini sağladık.

Umarım sizlere farklı bir bakış açısı katmıştır.
İyi forumlar!
 

Muslukcu

Katılımcı Üye
17 Kas 2021
699
262
Tesisat dükkanı
Merhabalar, Sizlere bugün Server-Side Template Injection'dan bahsedeceğim.

Server-Side Template Injection modern web uygulamalarının MVC(Model View Controller) ve MVT( Model View Template) tabanlı yapılara yönelmesiyle ve bu yapıların doğru yönetilmemesiyle oluşan bir güvenlik zaafiyetidir.

Bu yapıların işleyişinden çok detaylı bahsetmeyeceğim. Fakat eğer ilginizi çekerse konuya sorularınızı atarsanız cevaplarım.

Saldırganları ilgilendiren taraf nedir?
Bu yapılar genel olarak html, js, vb. gibi standart bir web formunun içerisinde yer alan komponentleri backend tarafında renderlayıp, frontende iletmesiyle bilinirler. Örneğin siz bir kullanıcı olarak bir alışveriş sitesine kayıt oldunuz ve yorum yaptınız. Sizin yorumunuz frontend içerisinde {{comment}} belirli ayraçlar ile değişken olarak tutulur. Daha sonrasında backend bunu renderlarken ayraçları kontrol eder ve içerisinde yer alan değişkeni veritabanından, backendden veya nerede tutuyorsa oradan getirir ve frontende {{comment}} yerine "x kişisinin yorumu" şeklinde frontende iletir.

mSHIg3p.png

(Django ile sabit bir değişkenin Template Engine sürecinden geçmesi.)

Yani aslında burada tek bir html sayfası(Template) mevcuttur. Fakat dinamik olarak kullanıcının girdilerine göre backend tarafında html sayfası şekillendirilir ve frontende iletilir. Renderlama işini yapan aracı Template Engine olarak adlandırırız.

Eğer bu işlemler yapılırken arada hiç bir filtreleme, sanitized işlemi yapılmadan kullanıcı girdileri template içerisine gömülürse, saldırganlar girdileri şekillendirerek farklı saldırı vektörleri hazırlayabilir.

Bazı Template Engin 'ler:

Python - Jinja2, Mako, Django Templates
JavaScript - Handlebars, Mustache, EJS
PHP - Twig, Smarty, Blade
Java - Thymeleaf, FreeMarker, Velocity
.Net - Razor, WebForms
Ruby - ERB (Embedded Ruby), Haml, Slim
Go - html/template
Perl - Mason
Rust - Handlebars, Tera

SSTI Saldırı Vektörleri:
  1. Veritabanı erişimi: Saldırganlar uygulamanın arkasındaki veritabanına erişebilir ve özel bilgileri çalabilir veya değiştirebilir.
  2. Command Injection: Saldırganlar uygulamanın arkasındaki sisteme komutlar göndererek, sistemi kontrol edebilir veya zararlı kod yükleyebilir.
  3. File Injection: Saldırganlar uygulamanın arkasındaki sistemde dosyalara erişebilir veya dosyaları değiştirebilir.
  4. Arbitrary File Read: Saldırganlar uygulamanın arkasındaki sistemdeki dosyaları okuyabilir, özellikle sensetive veya kritik dosyalar.
  5. Remote Code Execution: Saldırganlar uygulamanın arkasındaki sistemdeki kodları çalıştırabilir veya zararlı kod yükleyebilir.
  6. Denial of Service (DoS) saldırıları: Saldırganlar uygulamayı yavaşlatabilir, kilitleyebilir veya kullanılamaz hale getirebilir.
  7. Session hijacking: Saldırganlar uygulama içerisindeki session tokenleri çalabilir ve kullanıcının kimliğini suistimal edebilir.
Örnek Bir Saldırı Vektörü:
PortSwigger üzerinde yer alan lablardan örnek bir saldırı vektörü uygulayalım.
waPpsf1.png

Buradaki laba göre hedef websitede ERB Template engine bulunuyor. Bizden Server-Side Template Injection yöntemi ile sunucuda yer alan morale.txt dosyasını silmemizi istiyor. ERB yapısının ve template taglarinin kullanımına buradan bakabilirsiniz.

jr6E2fm.png

Burp suite ile sayfalarda dolaştıktan sonra istek atılan yerleri kontrol ettiğimde message parametresi alan bir url adresi buldum. Buraya aynı XSS' de yer aldığı gibi verdiğim komutları html içerisine basıyor.
hsyIHZ8.png

dedimki:<%=7*7%>%20Mentalistler şeklinde parametreye bir payload gönderdiğimde, ERB template tagını alıyor ve sonuç olarak bize 7*7'nin sonucunu yani 49'u döndürüyor. Yani burada bir SSTI zaafiyeti olduğunu tespit etmiş olduk.
z81hv5Q.png

<%= File.open('/etc/passwd').read %> payloadını yazarak /etc/passwd dosyasına erişmiş olduk. Sadece örnek bir kullanım için bu adımı gösterdim.

Txx3caP.png

Şimdi lab'ın bizden yapmamızı istediği görev için morale.txt dosyasını silmemiz gerekiyor. Bunun için <%= system('rm morale.txt') %> payloadını çalıştırdım ve bana true olarak yanıt döndürdü. Ardından PortSwigger bu labı çözdüğümüzün bildirimini verdi. Yazmış olduğumuz payload içerisinde os komutu çalıştırdık ve rm komutu ile morale.txt dosyasının silinmesini sağladık.

Umarım sizlere farklı bir bakış açısı katmıştır.
İyi forumlar!
Elinize sağlık
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.