
이 저장소는 django-summernote 버전 0.8.20.0(및 이전 버전)에서 발견된 조건부 원격 코드 실행(RCE) 취약점에 대한 개념 증명(PoC)을 포함합니다.
이 취약점은 setup.py의 엄격한 의존성 강제 부재와 forms.py의 대체(fallback) 로직에서 발생합니다.
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)을 업로드할 수 있으며, views.py가 전적으로 폼 검증에 의존하므로 원격 코드 실행(RCE) 또는 XSS로 이어질 수 있습니다.
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
유지보수자는 setup.py의 install_requires에 Pillow를 추가하거나 ImageField 사용을 하드 의존성으로 강제해야 합니다.