CouchDB, MongoDB, NoSQL, Redis

NoSQL Injection: MongoDB, Redis и CouchDB под прицелом

Привет, друг!

NoSQL базы данных стали мейнстримом, но многие разрабы до сих пор думают, что раз нет SQL — значит, нет и SQL Injection. Ошибочка! NoSQL Injection — это реальная угроза, и она часто опаснее классических SQLi. Давай разберём, как ломаются три популярных NoSQL базы: MongoDB, Redis и CouchDB.

MongoDB: Когда JSON становится оружием

MongoDB использует JavaScript-подобный синтаксис для запросов, и именно здесь кроется главная засада. Большинство уязвимостей возникает из-за прямой подстановки пользовательского ввода в запросы.

Классический пример уязвимого кода:

Выглядит безобидно, но если отправить JSON вместо строки:

Бац! Ты авторизовался, обойдя проверку пароля. Оператор $ne (not equal) всегда вернёт первого пользователя, у которого username и password не равны null — то есть почти любого.

Более продвинутые техники:

  • JavaScript Injection через $where:

Regex DoS через $regex:

Можно перебирать пароль символ за символом, анализируя время ответа.

Защита:

  • Всегда валидируй типы данных
  • Используй параметризованные запросы
  • Отключай $where в продакшене
  • Используй схемы валидации (Mongoose, Joi)

Redis: Когда кеш превращается в backdoor

Redis — это in-memory база, которая часто используется для кеширования и сессий. Основная проблема — команды Redis передаются как обычные строки, и если ты строишь их конкатенацией — ты уязвим.

Уязвимый пример:

Если user_id содержит символы новой строки, можно инжектить дополнительные команды:

Это выполнит команду FLUSHALL, которая удалит ВСЕ данные из Redis. Game over.

Другие векторы атак:

  • Config overwrite через CONFIG SET:

Сохраняет базу как PHP файл на диске → webshell.

  • Lua injection (если используется EVAL):

Защита:

  • Никогда не конкатенируй команды
  • Используй параметризованные методы библиотек
  • Настрой rename-command для опасных команд в redis.conf
  • Используй ACL (Redis 6+) для ограничения доступа

CouchDB: HTTP API как слабое звено

CouchDB работает через HTTP REST API и использует JSON для запросов. Основная проблема — MapReduce функции и view queries, которые выполняют JavaScript на сервере.

Уязвимости в MapReduce:

Если username не санитизирован:

Это позволяет выполнить произвольный JS код и, например, прочитать всю базу.

HTTP Parameter Pollution:

CouchDB парсит query-параметры, и можно использовать несколько параметров с одинаковым именем:

В зависимости от реализации, второй параметр может перезаписать первый, обходя логику фильтрации.

Защита:

  • Используй design documents с предопределёнными views
  • Валидируй и санитизируй все входные данные
  • Используй CouchDB Security Object для контроля доступа
  • Отключай динамическое создание views в продакшене

Универсальные принципы защиты

Вне зависимости от базы данных:

  • Whitelist валидация — проверяй не только содержимое, но и тип данных
  • Принцип наименьших привилегий — база не должна иметь права на admin команды
  • Мониторинг — логируй подозрительные запросы (множественные операторы, regex, специальные символы)
  • WAF — используй Web Application Firewall для фильтрации подозрительных паттернов
  • Rate limiting — защита от автоматических атак типа regex DoS

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

  • NoSQLMap — автоматический сканер для MongoDB и CouchDB
  • nosqli — набор payloads для тестирования различных NoSQL баз
  • Burp Suite с плагином NoSQL Scanner
  • Custom scripts — для Redis лучше писать свои тесты, так как универсальных инструментов мало

Заключение

NoSQL Injection — это не миф, а реальность. Базы без SQL не означают базы без уязвимостей. Главное правило — никогда не доверяй пользовательскому вводу, всегда валидируй типы данных и используй безопасные методы библиотек. И помни: если можешь построить запрос конкатенацией строк — значит, можешь и взломать систему этим же способом.

NoSQL Injection: MongoDB, Redis и CouchDB под прицелом

На этом все. Всем хорошего дня!