
إثبات مفهوم (PoC) لرفع ملفات عشوائي يؤدي إلى تنفيذ تعليمات برمجية عن بُعد (RCE) في django-summernote عند غياب Pillow. يستغل CWE-434 لرفع ويب شيل.
يحتوي هذا المستودع على إثبات المفهوم (PoC) لثغرة تنفيذ تعليمات برمجية عن بُعد (RCE) مشروط تم اكتشافها في django-summernote الإصدار 0.8.20.0 (وما قبله).
تكمُن الثغرة في عدم فرض الاعتماديات بشكل صارم في setup.py ومنطق التراجع في forms.py.
تتعامل حزمة django-summernote مع مكتبة Pillow (المطلوبة للتحقق الصارم من الصور) على أنها اعتمادية اختيارية. إذا لم تكن Pillow مثبتة على الخادم، يقوم UploadForm بتخفيض مستوى حقل إدخال الملف من forms.ImageField إلى forms.FileField العام بشكل تلقائي.
الكود الضعيف (forms.py):
try:
from PIL import Image
FIELD = forms.ImageField # Validates image content
except ImportError:
FIELD = forms.FileField # Accepts ANY file type (Dangerous)
يسمح هذا السلوك للمهاجم برفع ملفات تعسفية (مثل .php، .py، .sh، .html) بدلاً من الصور، مما يؤدي إلى تنفيذ تعليمات برمجية عن بُعد (RCE) أو XSS، حيث يعتمد views.py فقط على التحقق من النماذج.
ثبّت django-summernote بدون Pillow:
pip install django-summernote
pip uninstall Pillow # Ensure Pillow is gone
شغّل PoC:
python3 poc.py
المخرجات المتوقعة:
[+] 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
يجب على المستخدمين التأكد من تثبيت Pillow في بيئتهم لفرض التحقق من الصور:
pip install Pillow
يجب على القائمين على الصيانة نقل Pillow إلى install_requires في setup.py أو فرض اعتماد صارم على استخدام ImageField.