📦 NoSQL-инъекции: Базы данных тоже ошибаются

Кратко: Все знают про SQL-инъекции, где злоумышленник вставляет кавычку и ломает запрос к реляционной базе. Но в последние годы всё больше проектов переходят на NoSQL — MongoDB, Cassandra, CouchDB. И разработчики забывают, что эти базы тоже можно взломать. NoSQL-инъекции работают иначе, но результат тот же: кража данных, авторизация без пароля и полная компрометация базы.

▫️ Как это работает (SQL vs NoSQL) В SQL злоумышленник меняет структуру запроса: ' OR '1'='1. Сервер видит SELECT * FROM users WHERE user='admin' AND pass='' OR '1'='1'. Условие всегда истинно, логин пускает. В NoSQL запросы — это JSON-объекты. Пользовательский ввод тоже подставляется в этот JSON. Если не экранировать, можно подменить оператор сравнения. Вместо pass = "12345" сервер получает pass = {$ne: ""} — «пароль не равен пустой строке», что всегда истинно.

▫️ Атака на MongoDB (пример) Уязвимый код Node.js: app.post('/login', (req, res) => { db.collection('users').findOne({ username: req.body.username, password: req.body.password }, (err, user) => { ... }); });

Пользователь вводит: · username: admin · password: {"$ne": ""}

Сервер строит запрос: { username: "admin", password: { "$ne": "" } }

MongoDB ищет документ: username = admin И password НЕ РАВЕН пустой строке. Если пароль admin вообще существует, сервер найдёт запись и пустит злоумышленника. Он не знает пароль, но зашёл.

▫️ Варианты атак Авторизация без пароля: {$ne: null} или {$gt: ""} вместо конкретного пароля. Подбор данных: Используем {$regex: "^a"}, {$regex: "^b"} — перебираем первый символ. {$regex: "^ad"} — второй, и так далее. За несколько сотен запросов можно вытащить пароль по буквам. Кража всей таблицы: {$ne: null} ко всем полям. Инъекции в параметрах URL: GET /users?search=admin&role[$ne]=user. Найдет администраторов, где роль не равна user.

▫️ Где искать · Логин-формы (подставить {$ne: ""} в поле пароля) · Поиск и фильтры (параметры в URL) · API с JSON-телом запроса · GraphQL-эндпоинты с NoSQL-бэкендом

▫️ Как защищаться Валидация типов: Проверять, что строка — это строка, а не объект. Очистка ввода: Удалять операторы $ и . из пользовательского ввода. Использовать параметризованные запросы: Где поддерживается. Schema validation: На уровне БД запретить поля с $. Минимальные привилегии: Под каким пользователем приложение подключается к БД?

▫️ Культурный феномен · «Нет SQL — нет инъекций» — опасный миф. Нет SQL, но есть JSON и операторы. · $ne — новый «' or 1=1». Самый популярный тест на NoSQL-инъекцию. · MongoDB vs PostgreSQL — разработчики выбирают MongoDB для скорости, забывая о валидации. · Инъекции через URL — [$ne]=1 ломает фильтры, если разработчик не экранирует квадратные скобки.

▫️ Современное положение (2026) MongoDB, Cassandra, CouchDB, Amazon DynamoDB — все уязвимы к неправильной валидации ввода. Особенно страдают Node.js и Python-приложения, где нет строгой типизации. NoSQL-инъекции регулярно находят в баг-баунти-программах крупных компаний. Главный вывод: NoSQL не защищает от инъекций. Он просто меняет синтаксис атаки. Валидируйте типы, фильтруйте спецсимволы, не доверяйте пользовательскому вводу. И помните: $ne — это ваш новый враг.

#nosql #nosqlinjection #mongodb #веббезопасность #пентест #инфобез

📦 NoSQL-инъекции: Базы данных тоже ошибаются | Сетка — социальная сеть от hh.ru