Penetration Test Django: ORM Injection, Admin Security e Sicurezza Python Enterprise
Django è il framework Python enterprise più adottato per applicazioni governative italiane, università, e enterprise legacy. Le vulnerabilità recenti includono CVE-2024-45230 (strip_tags DoS), CVE-2024-39614 (denylist bypass), CVE-2023-43665 (truncatechars_html DoS). Matproof Sentinel esegue pentest Django mirati con prova di sfruttamento e report audit-ready da 149 €.
Perché Django richiede pentest specifico
Django è il framework Python più maturo (2005+), particolarmente usato in Italia per: portali Pubblica Amministrazione (SPID integrations), CMS universitari, sistemi di booking enterprise, e applicazioni con backend complessi. La sua maturità è un vantaggio (security by default, ORM type-safe), ma la vastità del framework introduce superficie d'attacco specifica: Django Admin esposto è il vector di attacco #1 (enumerazione utenti, brute-force), SECRET_KEY leak via DEBUG=True esposto causa session forgery, ORM permette raw queries con concatenation che fanno SQL injection, e template tags possono permettere SSTI in certi pattern. CVE recenti illustrano i rischi: CVE-2024-45230 e CVE-2023-43665 abilitano DoS via template tags; CVE-2024-39614 bypassa filtri di sicurezza personalizzati. Per organizzazioni italiane con Django (PA, università, enterprise), un pentest Django documentato è essenziale per GDPR Art. 32 compliance.
- CVE-2024-45230 (Django < 4.2.16/5.0.9): DoS via strip_tags template filter su input dimensioni elevate — exploitable in qualsiasi template con {{ user_input|striptags }}.
- CVE-2024-39614 (Django < 4.2.14/5.0.7): denylist bypass nel filtro safestring — permette XSS in template che usano safestring per content che dovrebbe essere escaped.
- CVE-2023-43665 (Django < 4.2.6): DoS via truncatechars_html template filter — exploitable in template che truncano HTML user-provided.
- Django Admin enumeration: /admin/login/ permette user enumeration tramite timing-side-channel (login esistente vs no), brute-force senza rate limiting di default.
- SECRET_KEY leak: DEBUG=True in produzione espone SECRET_KEY in error pages — leak permette session cookie forgery, signed URL forgery (PasswordReset, etc.).
- Django Templates SSTI: template tags personalizzati con eval() o exec() su input utente, custom safestring con bypass del auto-escape.
- Per applicazioni italiane PA (SPID, CIE, SISTRI legacy), il pentest Django è prerequisito per ANS (Agenzia Italiana per il Digitale) compliance.
Cosa testiamo specificamente in un'applicazione Django
- CVE detection: 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: enumerazione utenti via timing, brute-force protection (django-axes o equivalent), 2FA enforcement, IP whitelist.
- SECRET_KEY exposure: DEBUG=True detection in produzione (anti-pattern), SECRET_KEY in plaintext in settings.py committed.
- ORM injection: raw() queries con string concatenation, extra() con select, RawSQL, Q objects con SQL injection.
- Template SSTI: custom template tags con eval/exec, safestring bypass del auto-escape, |safe filter applicato a input utente.
- Django REST Framework (DRF): permissions per ViewSet, serializer fields esposti che non dovrebbero, DRF Browsable API esposta in produzione.
- Authentication: django.contrib.auth con password hasher weak (legacy PBKDF2 con basso iteration count), session_engine secure (DB vs cache vs cookie signed).
- CSRF: csrf_exempt utilizzo eccessivo, CSRF token in JSON API senza Origin header validation.
- File upload: validation MIME type lato server (mai trust client), path traversal in upload_to, esecuzione Python files in MEDIA_ROOT.
- Composition Analysis: requirements.txt + Pipfile.lock per CVE in Django + dipendenze (psycopg, Pillow, requests, etc.).
Esempio di finding
Django DEBUG=True in produzione — SECRET_KEY leak via 500 error page
L'applicazione Django ha DEBUG=True in produzione (rilevato visitando un URL non esistente come /thispagedoesnotexist123). La pagina 500 di Django con DEBUG=True espone: (1) settings completo incluso SECRET_KEY, DATABASE configuration con credentials in plaintext, EMAIL_HOST_PASSWORD; (2) stack trace con file paths interni; (3) ambiente Python (versioni, virtualenv path); (4) local variables di ogni stack frame inclusi tutti i request data. SECRET_KEY è particolarmente critico: permette forgery di session cookie, signed URLs (password reset, email confirmation), CSRF token. Il test ha permesso di: forgiare un session cookie per qualsiasi utente, generare password reset URL per qualsiasi email, leggere tutte le configurazioni.
Correzione: Azione immediata (priorità 1): impostare DEBUG=False in produzione e rebuild dei container. Configurazione corretta in settings.py:\n\nDEBUG = os.environ.get('DJANGO_DEBUG', 'False').lower() == 'true'\nALLOWED_HOSTS = ['matproof.com', 'www.matproof.com']\n\nAzioni complementari: ruotare immediatamente SECRET_KEY (force re-login di tutti gli utenti, invalidare tutti i password reset link); ruotare DATABASE_PASSWORD, EMAIL_HOST_PASSWORD, e qualsiasi credenziale potenzialmente leakata; configurare error reporting via Sentry/Rollbar per gestire 500 senza esporre dettagli; audit access log di tutti gli accessi a URL non-esistenti negli ultimi 90 giorni per identificare potenziali attaccanti che hanno già visto le configurazioni.
Riferimento: CWE-489 Active Debug Code · CWE-200 Information Exposure · OWASP A05:2021 Security Misconfiguration · Django Security Documentation
Pentest Django: opzioni a confronto
| — | Scan gratuito | Matproof Sentinel | Consulenza tradizionale |
|---|---|---|---|
| Motore di scansione automatizzato | ✓ (anteprima 3 min) | ✓ Scansione completa | ✗ Solo manuale |
| Copertura OWASP Top 10 | Parziale | ✓ Completa | ✓ Completa |
| Prova di exploit | ✗ | ✓ Per finding | ✓ Per finding |
| Mapping normativo (DORA/NIS2/ISO 27001) | ✗ | ✓ Automatizzato | ✓ Manuale |
| Report PDF pronto per l'audit | ✗ | ✓ Immediato | ✓ Consegna 2–4 settimane |
| Scansioni continue / ricorrenti | ✗ | ✓ Per deploy | ✗ Impegno annuale |
| Tempo al primo risultato | ~3 min | ~30 min scansione completa | 2–4 settimane |
| Prezzo | €0 | Da €149 | €8.000–€25.000 |
| Revisione codice sorgente (SAST) | ✗ | ✓ Piano Growth | ✓ In scope |
| Test API (REST/GraphQL) | ✗ | ✓ Automatizzato | ✓ Manuale |
Pacchetti pentest Django
- 1 scansione pentest completa
- Risultati prioritizzati da AI con CVSS 3.1
- Proof-of-exploit per ogni finding
- Report PDF (pronto per l'audit)
- Mapping normativo (DORA, NIS2, ISO 27001)
- Scansioni illimitate (fino a 3 domini)
- Monitoraggio continuo
- Integrazione CI/CD (GitHub, GitLab)
- Tutti i mapping normativi
- Supporto prioritario
- Scansioni + domini illimitati
- Test autenticati / White-Box
- Test API e infrastruttura cloud
- Account manager dedicato
- SLA risposta 24h
Domande frequenti sul pentest Django
Come testate il Django Admin specifically?
Django Admin è target di attacco #1 per applicazioni Django. Testiamo: user enumeration via timing side-channel, brute-force protection (django-axes / django-ratelimit), 2FA enforcement, IP whitelist su /admin/, audit log di accessi admin, CSRF su admin actions.
Testate anche Django REST Framework / Django Ninja / Django Async?
Sì. DRF ha specifiche permission audit, throttle_classes, serializer fields validation. Django Ninja (FastAPI-style) condivide rischi con FastAPI. Django Async views richiedono testing race conditions specifiche.
Come gestite Django con celery / Redis background tasks?
Celery tasks con user input possono creare code injection. Testiamo: serializzazione pickle (anti-pattern, abilita RCE), task chain con shared state, Redis exposure pubblica (Redis senza AUTH, exposed port).
Per applicazioni Django italiane PA (SPID, CIE), testate l'integration?
Sì. SPID OAuth2 flow ha specifiche validation richieste (SAML signature, AssertionConsumerService URL whitelist). CIE has carta-based authentication. Testiamo entrambi i flow per misconfigurazioni che potrebbero permettere account takeover.
Quanto tempo richiede un pentest Django completo?
60-90 minuti per applicazione Django tipica. Include CVE detection, Admin audit, ORM injection, template SSTI, DRF, authentication. Per applicazioni multi-tenant complesse: 2-3 ore.
Il report è accettato per AgID compliance e GDPR italiana?
Sì. Mapping esplicito GDPR Art. 32 + Codice Privacy + AgID Linee Guida Sicurezza ICT per la PA. Per applicazioni SPID/CIE, il report copre le specifiche security questionnaire AgID.
Argomenti correlati
Approfondisci — articoli correlati dal blog
Proteggi la tua applicazione Django ora
Primo scan in 3 minuti, pentest Django completo in 60-90 minuti. Report audit-ready GDPR / AgID / DORA da 149 €.
Avvia scan gratuito