Testy penetracyjne Django: ORM injection, bezpieczeństwo admina i Python dla enterprise
Django to najbardziej dojrzały framework Pythona (od 2005), szeroko używany do portali rządowych, CMS-ów uczelni i enterprise systemów rezerwacji. Najnowsze podatności obejmują CVE-2024-45230 (strip_tags DoS), CVE-2024-39614 (denylist bypass), CVE-2023-43665 (truncatechars_html DoS). Matproof Sentinel wykonuje ukierunkowane pentesty Django z raportami gotowymi do audytu od 149 EUR.
Dlaczego Django wymaga specjalistycznej wiedzy pentestowej
Django to najbardziej dojrzały framework Pythona, szczególnie używany w: portalach rządowych, CMS-ach uczelni, systemach enterprise ze złożonymi backendami. Jego dojrzałość to zaleta (bezpieczeństwo domyślnie, type-safe ORM), ale wielkość frameworka wprowadza specyficzne powierzchnie ataku: ekspozycja Django Admin to wektor ataku #1 (enumeracja użytkowników, brute-force), wyciek SECRET_KEY przez DEBUG=True powoduje fałszowanie sesji, ORM dopuszcza raw queries z konkatenacją umożliwiające SQL injection, a template tags mogą umożliwiać SSTI w określonych wzorcach. Dla organizacji z Django (rząd, uczelnie, enterprise) udokumentowany pentest Django jest niezbędny dla zgodności GDPR art. 32.
- CVE-2024-45230 (Django < 4.2.16/5.0.9): DoS przez filtr template strip_tags na dużym wejściu, wykorzystywalny w każdym templacie z {{ user_input|striptags }}.
- CVE-2024-39614 (Django < 4.2.14/5.0.7): denylist bypass w filtrze safestring, umożliwia XSS w templatach używających safestring dla zawartości, która powinna być escapowana.
- CVE-2023-43665 (Django < 4.2.6): DoS przez filtr template truncatechars_html, wykorzystywalny w templatach truncających HTML dostarczany przez użytkownika.
- Enumeracja Django Admin: /admin/login/ umożliwia enumerację użytkowników przez timing-side-channel, brute-force bez domyślnego rate limitingu.
- Wyciek SECRET_KEY: DEBUG=True w produkcji eksponuje SECRET_KEY na stronach błędów, wyciek umożliwia fałszowanie cookie sesji, fałszowanie URL podpisanych.
- Django Templates SSTI: custom template tags z eval() lub exec() na wejściu użytkownika, custom safestring z obejściem auto-escape.
- Dla aplikacji objętych GDPR, NIS2 lub DORA pentest Django jest wymaganym dowodem zgodności.
Co konkretnie testujemy w aplikacji Django
- Detekcja CVE: Django < 4.2.16/5.0.9 (CVE-2024-45230), < 4.2.14/5.0.7 (CVE-2024-39614), < 4.2.6 (CVE-2023-43665).
- Django Admin: enumeracja użytkowników przez timing, ochrona przed brute-force (django-axes lub równoważny), wymuszanie 2FA, whitelista IP.
- Ekspozycja SECRET_KEY: detekcja DEBUG=True w produkcji (antywzorzec), SECRET_KEY w plaintexcie w commitowanym settings.py.
- ORM injection: zapytania raw() z konkatenacją stringów, extra() z select, RawSQL, obiekty Q z SQL injection.
- Template SSTI: custom template tags z eval/exec, obejście safestring auto-escape, filtr |safe stosowany do wejścia użytkownika.
- Django REST Framework (DRF): permissions per ViewSet, pola serializera, które nie powinny być eksponowane, DRF Browsable API eksponowane w produkcji.
- Uwierzytelnianie: django.contrib.auth ze słabym password hasherem (legacy PBKDF2 z niską liczbą iteracji), bezpieczny session_engine (DB vs cache vs signed cookie).
- CSRF: nadużycie csrf_exempt, token CSRF w API JSON bez walidacji nagłówka Origin.
- File upload: walidacja typu MIME po stronie serwera (nigdy nie ufaj klientowi), path traversal w upload_to, wykonanie pliku Pythona w MEDIA_ROOT.
- Composition Analysis: requirements.txt i Pipfile.lock pod kątem CVE w Django i zależnościach (psycopg, Pillow, requests itd.).
Sample finding
Django DEBUG=True w produkcji, czyli wyciek SECRET_KEY przez stronę błędu 500
Aplikacja Django ma DEBUG=True w produkcji (wykryte przez wizytę nieistniejącego URL jak /thispagedoesnotexist123). Strona Django 500 z DEBUG=True eksponuje: (1) kompletne settings w tym SECRET_KEY, konfigurację DATABASE z plaintextowymi poświadczeniami, EMAIL_HOST_PASSWORD; (2) stack trace ze ścieżkami plików wewnętrznych; (3) środowisko Pythona; (4) zmienne lokalne każdej ramki stosu w tym wszystkie dane żądania. SECRET_KEY jest szczególnie krytyczny: umożliwia fałszowanie cookie sesji, podpisanych URL (reset hasła, potwierdzenie email), tokena CSRF. Test umożliwił: fałszowanie cookie sesji dla dowolnego użytkownika, generowanie URL resetu hasła dla dowolnego emaila, odczyt wszystkich konfiguracji.
Fix: Działanie natychmiastowe (priorytet 1): ustaw DEBUG=False w produkcji i przebuduj kontenery. Poprawna konfiguracja w settings.py:\n\nDEBUG = os.environ.get('DJANGO_DEBUG', 'False').lower() == 'true'\nALLOWED_HOSTS = ['matproof.com', 'www.matproof.com']\n\nDziałania uzupełniające: natychmiastowa rotacja SECRET_KEY (wymuszone ponowne zalogowanie wszystkich użytkowników, unieważnienie wszystkich linków resetu hasła); rotacja DATABASE_PASSWORD, EMAIL_HOST_PASSWORD; konfiguracja zgłaszania błędów przez Sentry/Rollbar do obsługi 500 bez eksponowania detali; audyt logów dostępu dla wszystkich wejść na nieistniejące URL z ostatnich 90 dni.
Reference: CWE-489 Active Debug Code · CWE-200 Information Exposure · OWASP A05:2021 Security Misconfiguration · Django Security Documentation
Porównanie opcji pentestu Django
| — | Free scan | Matproof Sentinel | Traditional consultancy |
|---|---|---|---|
| Automated scan engine | ✓ (3-min preview) | ✓ Full scan | ✗ Manual only |
| OWASP Top 10 coverage | Partial | ✓ Complete | ✓ Complete |
| Proof-of-exploit evidence | ✗ | ✓ Per finding | ✓ Per finding |
| Regulatory mapping (DORA/NIS2/ISO 27001) | ✗ | ✓ Automated | ✓ Manual |
| Audit-ready PDF report | ✗ | ✓ Instant | ✓ 2–4 weeks delivery |
| Continuous / recurring scans | ✗ | ✓ Per deploy | ✗ Annual engagement |
| Time to first result | ~3 min | ~30 min full scan | 2–4 weeks |
| Price | €0 | From €149 | €8,000–€25,000 |
| Source code review (SAST) | ✗ | ✓ On Growth plan | ✓ Scoped engagement |
| API testing (REST/GraphQL) | ✗ | ✓ Automated | ✓ Manual |
Pakiety pentestów Django
- 1 full pentest scan
- AI-prioritized findings with CVSS 3.1
- Proof-of-exploit per finding
- Audit-ready PDF report
- Regulatory mapping (DORA, NIS2, ISO 27001)
- Unlimited scans (up to 3 domains)
- Continuous monitoring
- CI/CD integration (GitHub, GitLab)
- All regulatory mappings
- Priority support
- Unlimited scans + domains
- Authenticated / White-Box testing
- API & cloud infrastructure tests
- Dedicated security account manager
- 24h SLA response time
Najczęściej zadawane pytania o pentest Django
Jak testujecie Django Admin konkretnie?
Django Admin to cel ataku #1 dla aplikacji Django. Testujemy: enumerację użytkowników przez timing side-channel, ochronę przed brute-force (django-axes / django-ratelimit), wymuszanie 2FA, whitelistę IP na /admin/, audit log dostępu admin, CSRF na akcjach admina.
Czy testujecie też Django REST Framework / Django Ninja / Django Async?
Tak. DRF ma specyficzny audyt permissions, throttle_classes, walidację pól serializera. Django Ninja (w stylu FastAPI) dzieli ryzyka z FastAPI. Django Async views wymagają specyficznych testów race conditions.
Jak obsługujecie Django z celery / Redis background tasks?
Taski Celery z wejściem użytkownika mogą tworzyć code injection. Testujemy: pickle serialization (antywzorzec, umożliwia RCE), task chain ze stanem współdzielonym, ekspozycję Redis (Redis bez AUTH, eksponowany port).
Czy testujecie integracje rządowych aplikacji Django?
Tak. Przepływy SSO mają specyficzne wymagania walidacji (podpis SAML, whitelista URL AssertionConsumerService). Testujemy te przepływy pod kątem błędnej konfiguracji, która mogłaby umożliwić przejęcie konta.
Jak długo trwa kompletny pentest Django?
60-90 minut dla typowej aplikacji Django. Dla złożonych aplikacji multi-tenant: 2-3 godziny.
Czy raport jest akceptowany dla audytów GDPR?
Tak. Jednoznaczne mapowanie do GDPR art. 32 i krajowych przepisów o ochronie danych. Dla aplikacji z wrażliwymi danymi raport wykazuje regularne testowanie ochrony i śledzenie remediation.
Go deeper — related blog articles
Zabezpiecz swoją aplikację Django już teraz
Pierwszy skan w 3 minuty, kompletny pentest Django w 60-90 minut. Raport gotowy do audytu GDPR / DORA od 149 EUR.
Rozpocznij darmowy skan