
Pillow が存在しない場合の django-summernote における任意ファイルアップロード RCE の概念実証。CWE-434 を悪用してウェブシェルをアップロードします。
このリポジトリには、django-summernote バージョン 0.8.20.0(およびそれ以前)で発見された条件付きリモートコード実行 (RCE) の脆弱性に対する Proof of Concept (PoC) が含まれています。
この脆弱性は、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)をアップロードでき、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 の使用を必須の依存関係として強制すべきです。