
Ce dépôt contient une preuve de concept (PoC) pour une vulnérabilité d'exécution de code à distance (RCE) conditionnelle découverte dans django-summernote version 0.8.20.0 (et versions antérieures).
La vulnérabilité réside dans l'absence de gestion stricte des dépendances dans setup.py et dans la logique de repli dans forms.py.
Le paquet django-summernote traite la bibliothèque Pillow (requise pour la validation stricte des images) comme une dépendance optionnelle. Si Pillow n'est pas installé sur le serveur, UploadForm dégrade silencieusement le champ de saisie de fichier de forms.ImageField vers le générique forms.FileField.
Code vulnérable (forms.py) :
try:
from PIL import Image
FIELD = forms.ImageField # Validates image content
except ImportError:
FIELD = forms.FileField # Accepts ANY file type (Dangerous)
Ce comportement permet à un attaquant de téléverser des fichiers arbitraires (par exemple .php, .py, .sh, .html) au lieu d'images, conduisant à une exécution de code à distance (RCE) ou à du XSS, car views.py repose uniquement sur la validation du formulaire.
Installer django-summernote sans Pillow :
pip install django-summernote
pip uninstall Pillow # Ensure Pillow is gone
Exécuter le PoC :
python3 poc.py
Sortie attendue :
[+] Verified: Pillow is NOT installed. Vulnerable logic active.
[*] Attempting to upload a Web Shell (.php)...
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[!!!] VULNERABILITY SUCCESS: SHELL UPLOADED [!!!]
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[+] Form Validation Passed for: exploit.php
Les utilisateurs doivent s'assurer que Pillow est installé dans leur environnement pour appliquer la validation des images :
pip install Pillow
Les mainteneurs devraient déplacer Pillow vers install_requires dans setup.py ou imposer une dépendance stricte à l'utilisation de ImageField.