NIS2 & DORA in force. EU AI Act next — book a demo

Django Penetration Testing: ORM Injection, Admin Security & Python Enterprise Security

Django is the most mature Python framework (2005+), widely used for government portals, university CMSes, and enterprise booking systems. Recent vulnerabilities include CVE-2024-45230 (strip_tags DoS), CVE-2024-39614 (denylist bypass), CVE-2023-43665 (truncatechars_html DoS). Matproof Sentinel runs targeted Django pentests with audit-ready reports from €149.

Start free scan
MW
Written by Malte Wagenbach
Founder of Matproof Security. Specialized in AI-driven penetration testing and EU compliance (DORA, NIS2, ISO 27001, SOC 2).
Last reviewed: May 17, 2026

Why Django requires specific pentest expertise

Django is the most mature Python framework, particularly used for: government portals, university CMSes, enterprise systems with complex backends. Its maturity is an advantage (security by default, type-safe ORM), but the framework's vastness introduces specific attack surfaces: exposed Django Admin is attack vector #1 (user enumeration, brute-force), SECRET_KEY leak via DEBUG=True causes session forgery, ORM allows raw queries with concatenation that enable SQL injection, and template tags can enable SSTI in certain patterns. For organizations with Django (gov, universities, enterprise), a documented Django pentest is essential for GDPR Art. 32 compliance.

  • CVE-2024-45230 (Django < 4.2.16/5.0.9): DoS via strip_tags template filter on large input — exploitable in any template with {{ user_input|striptags }}.
  • CVE-2024-39614 (Django < 4.2.14/5.0.7): denylist bypass in safestring filter — enables XSS in templates using safestring for content that should be escaped.
  • CVE-2023-43665 (Django < 4.2.6): DoS via truncatechars_html template filter — exploitable in templates that truncate user-provided HTML.
  • Django Admin enumeration: /admin/login/ enables user enumeration via timing-side-channel, brute-force without default rate limiting.
  • SECRET_KEY leak: DEBUG=True in production exposes SECRET_KEY in error pages — leak enables session cookie forgery, signed URL forgery.
  • Django Templates SSTI: custom template tags with eval() or exec() on user input, custom safestring with auto-escape bypass.
  • For applications under GDPR, NIS2, or DORA, Django pentest is required compliance evidence.

What we specifically test in a Django application

  • 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: user enumeration via timing, brute-force protection (django-axes or equivalent), 2FA enforcement, IP whitelist.
  • SECRET_KEY exposure: DEBUG=True detection in production (anti-pattern), SECRET_KEY in plaintext in committed settings.py.
  • ORM injection: raw() queries with string concatenation, extra() with select, RawSQL, Q objects with SQL injection.
  • Template SSTI: custom template tags with eval/exec, safestring bypass of auto-escape, |safe filter applied to user input.
  • Django REST Framework (DRF): permissions per ViewSet, serializer fields exposed that shouldn't be, DRF Browsable API exposed in production.
  • Authentication: django.contrib.auth with weak password hasher (legacy PBKDF2 with low iteration count), secure session_engine (DB vs cache vs signed cookie).
  • CSRF: csrf_exempt overuse, CSRF token in JSON API without Origin header validation.
  • File upload: server-side MIME type validation (never trust client), path traversal in upload_to, Python file execution in MEDIA_ROOT.
  • Composition Analysis: requirements.txt + Pipfile.lock for CVEs in Django + dependencies (psycopg, Pillow, requests, etc.).

Sample finding

Critical

Django DEBUG=True in production — SECRET_KEY leak via 500 error page

The Django application has DEBUG=True in production (detected by visiting a non-existent URL like /thispagedoesnotexist123). The Django 500 page with DEBUG=True exposes: (1) complete settings including SECRET_KEY, DATABASE configuration with plaintext credentials, EMAIL_HOST_PASSWORD; (2) stack trace with internal file paths; (3) Python environment; (4) local variables of each stack frame including all request data. SECRET_KEY is particularly critical: it enables session cookie forgery, signed URLs (password reset, email confirmation), CSRF token. The test enabled: forging session cookies for any user, generating password reset URLs for any email, reading all configurations.

Fix: Immediate action (priority 1): set DEBUG=False in production and rebuild containers. Correct configuration in settings.py:\n\nDEBUG = os.environ.get('DJANGO_DEBUG', 'False').lower() == 'true'\nALLOWED_HOSTS = ['matproof.com', 'www.matproof.com']\n\nComplementary actions: immediately rotate SECRET_KEY (force re-login all users, invalidate all password reset links); rotate DATABASE_PASSWORD, EMAIL_HOST_PASSWORD; configure error reporting via Sentry/Rollbar to handle 500s without exposing details; audit access logs of all accesses to non-existent URLs in last 90 days.

Reference: CWE-489 Active Debug Code · CWE-200 Information Exposure · OWASP A05:2021 Security Misconfiguration · Django Security Documentation

Django pentest options compared

Free scanMatproof SentinelTraditional consultancy
Automated scan engine✓ (3-min preview)✓ Full scan✗ Manual only
OWASP Top 10 coveragePartial✓ 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 scan2–4 weeks
Price€0From €149€8,000–€25,000
Source code review (SAST)✓ On Growth plan✓ Scoped engagement
API testing (REST/GraphQL)✓ Automated✓ Manual

Django pentest packages

Single Run
€149 one-time
  • 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)
Buy single run
Recommended
Starter
€299 / month
  • Unlimited scans (up to 3 domains)
  • Continuous monitoring
  • CI/CD integration (GitHub, GitLab)
  • All regulatory mappings
  • Priority support
Start Starter
Growth
€799 / month
  • Unlimited scans + domains
  • Authenticated / White-Box testing
  • API & cloud infrastructure tests
  • Dedicated security account manager
  • 24h SLA response time
Contact for Growth

Frequently asked questions about Django pentest

How do you test Django Admin specifically?

Django Admin is the #1 attack target for Django applications. We test: user enumeration via timing side-channel, brute-force protection (django-axes / django-ratelimit), 2FA enforcement, IP whitelist on /admin/, audit log of admin access, CSRF on admin actions.

Do you also test Django REST Framework / Django Ninja / Django Async?

Yes. DRF has specific permission audit, throttle_classes, serializer fields validation. Django Ninja (FastAPI-style) shares risks with FastAPI. Django Async views require specific race conditions testing.

How do you handle Django with celery / Redis background tasks?

Celery tasks with user input can create code injection. We test: pickle serialization (anti-pattern, enables RCE), task chain with shared state, public Redis exposure (Redis without AUTH, exposed port).

Do you test government application Django integrations?

Yes. SSO flows have specific validation requirements (SAML signature, AssertionConsumerService URL whitelist). We test these flows for misconfigurations that could enable account takeover.

How long does a complete Django pentest take?

60-90 minutes for typical Django application. For complex multi-tenant applications: 2-3 hours.

Is the report accepted for GDPR audits?

Yes. Explicit mapping to GDPR Art. 32 + national data protection laws. For applications with sensitive data, the report demonstrates regular protection testing and remediation tracking.

Related

Go deeper — related blog articles

Protect your Django application now

First scan in 3 minutes, complete Django pentest in 60-90 minutes. Audit-ready GDPR / DORA report from €149.

Start free scan