
Prueba de concepto para RCE por carga arbitraria de archivos en django-summernote cuando falta Pillow. Explota CWE-434 para subir un web shell.
Este repositorio contiene una Prueba de Concepto (PoC) para una vulnerabilidad de Ejecución Remota de Código (RCE) Condicional descubierta en django-summernote versión 0.8.20.0 (y anteriores).
La vulnerabilidad existe en la falta de aplicación estricta de dependencias en setup.py y la lógica de respaldo en forms.py.
El paquete django-summernote trata la biblioteca Pillow (requerida para una validación estricta de imágenes) como una dependencia opcional. Si Pillow no está instalada en el servidor, UploadForm degrada el campo de entrada de archivos de forms.ImageField al genérico forms.FileField.
Código Vulnerable (forms.py):
try:
from PIL import Image
FIELD = forms.ImageField # Valida el contenido de la imagen
except ImportError:
FIELD = forms.FileField # Acepta CUALQUIER tipo de archivo (Peligroso)
Este comportamiento permite a un atacante cargar archivos arbitrarios (por ejemplo, .php, .py, .sh, .html) en lugar de imágenes, lo que lleva a Ejecución Remota de Código (RCE) o XSS, ya que views.py se basa únicamente en la validación del formulario.
Instalar django-summernote sin Pillow:
pip install django-summernote
pip uninstall Pillow # Asegúrate de que Pillow no esté
Ejecutar la PoC:
python3 poc.py
Salida esperada:
[+] Verificado: Pillow NO está instalado. Lógica vulnerable activa.
[*] Intentando cargar una Web Shell (.php)...
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[!!!] VULNERABILIDAD EXITOSA: SHELL CARGADA [!!!]
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[+] Validación del Formulario Superada para: exploit.php
Los usuarios deben asegurarse de que Pillow esté instalada en su entorno para forzar la validación de imágenes:
pip install Pillow
Los mantenedores deben mover Pillow a install_requires en setup.py o aplicar el uso obligatorio de ImageField como dependencia estricta.