Логотип
Главная | Статьи | NoSQL-инъекции в MongoDB: новые векторы через aggregation
NoSQL-инъекции в MongoDB: новые векторы через aggregation

NoSQL-инъекции в MongoDB: новые векторы через aggregation

3 февраля, 2026

27

MongoDB – это не SQL, и классические инъекции здесь не катят. Но разработчики расслабляются и льют пользовательский ввод прямо в запросы, думая, что NoSQL = безопасность. Спойлер: это не так. Aggregation pipeline открывает особенно жирные возможности для эксплуатации, потому что позволяет выполнять сложные операции, включая вычисления, условия и даже JavaScript.

Базовые NoSQL-инъекции в MongoDB

Перед тем как нырнуть в aggregation, освежим основы.

Классическая инъекция через операторы

Уязвимый код на Node.js:

Эксплойт с операторами сравнения

Отправляем JSON:

Запрос превращается в:

Обход аутентификации готов – $ne (not equal) пропустит любой пароль, который не null.

Другие операторы для инъекций

Aggregation Pipeline: новая поверхность атаки

Aggregation – это конвейер обработки данных в MongoDB. Он состоит из стадий ($match$group$project$lookup и т.д.), которые последовательно преобразуют документы.

Уязвимый код

Инъекция через $match

Если передать объект вместо строки:

Запрос становится:

Получаем все документы, где name не пустое – то есть все записи.

Продвинутые векторы через $where и JavaScript

Самое опасное – когда разработчики используют $where с JavaScript-выражениями.

Уязвимый код

RCE через $where

Финальное выражение:

Можно инжектить произвольный JavaScript:

Эксплуатация с функцией sleep

Инъекции через $lookup (JOIN-атаки)

$lookup позволяет делать JOIN между коллекциями. Если параметры инжектятся, можно получить данные из других таблиц.

Уязвимый код

Эксплойт

Получаем данные из таблицы admin_secrets, которая не должна быть доступна.

Инъекции через $expr и вычисления

$expr позволяет использовать выражения агрегации внутри запросов.

Уязвимый код

Атака через операторы агрегации

Blind NoSQL Injection через aggregation

Когда прямого вывода нет, используем слепые техники.

Boolean-based через $regex

Time-based через $where

Атаки через $function (MongoDB 4.4+)

С версии 4.4 MongoDB поддерживает $function для выполнения JavaScript прямо в aggregation.

Уязвимый код

RCE через $function

Расширенный эксплойт

Массовая эксплуатация через $facet

$facet позволяет выполнять несколько pipeline одновременно.

Атака

Одним запросом дампим данные из нескольких источников.

Автоматизация: NoSQL-сканер

Инструменты для автоматизации

NoSQLMap

Burp Suite + NoSQL Scanner Extension

Ручной сканер на Python

Защита от NoSQL-инъекций

Валидация входных данных

Запрет опасных операторов

Настройка MongoDB для безопасности

Чек-лист для пентеста MongoDB

  • Тестируй все параметры с операторами $ne$gt$regex$where
  • Проверяй aggregation endpoints на инъекции в $match$lookup$project
  • Ищи возможности для $function и JavaScript-выражений
  • Тестируй blind injection через timing с sleep()
  • Пробуй массовый дамп через $facet
  • Проверяй доступ к системным коллекциям (adminconfig)
  • Ищи MongoDB Express или другие админки на порту 8081
  • Брутфорси credentials через словари
  • Тестируй SSRF через $lookup с внешними источниками
  • Проверяй MongoDB на версию – старые версии имеют больше дыр

Вот так выглядит реальная атака на MongoDB через aggregation. Главное – помни, что разработчики часто забывают валидировать JSON-объекты, думая что NoSQL защищает их магически. Но операторы MongoDB – это просто JSON, и если его можно контролировать, можно ломать систему.