Вопрос или проблема
Это нормальный запрос к странице входа:
LoginForm%5Busername%5D=myuser&LoginForm%5Bpassword%5D=mypass
но если мы изменим его на:
LoginForm%5Busername%5D[%24testing]=myuser&LoginForm%5Bpassword%5D=mypass
то в приложении отображается эта ошибка:
Исключение MongoDB – yii\mongodb\Exception
неизвестный оператор: $testing
↵
Причина: MongoDB\Driver\Exception\CommandException
неизвестный оператор: $testing
в /var/www/admin/vendor/yiisoft/yii2-mongodb/src/Command.php на строке 65
больше информации:
в /var/www/admin/vendor/yiisoft/yii2-mongodb/src/Collection.php – yii\mongodb\Command::find('admin', ['username' => ['$testing' => '1'], 'status' => 10], [])
в /var/www/admin/vendor/yiisoft/yii2-mongodb/src/Query.php – yii\mongodb\Collection::find(['username' => ['$testing' => '1'], 'status' => 10], [], ['limit' => null, 'skip' => null])
Является ли это NoSQL-инъекцией или просто ошибкой? Возможно ли сгенерировать POC, как команда Sleep?
Ответ или решение
NoSQL Injection в MongoDB: Проблема и возможности
Введение
NoSQL инъекции представляют собой угрозу безопасности, аналогичную SQL-инъекциям, однако они касаются баз данных NoSQL, таких как MongoDB. Данная статья содержит анализ возможной уязвимости в контексте, предоставленном вами, и рассматривает возможности эксплуатации.
Описание проблемы
В приведенном вами примере, при нормальной отправке данных на страницу входа в приложение, запрос выглядит следующим образом:
LoginForm%5Busername%5D=myuser&LoginForm%5Bpassword%5D=mypass
Тем не менее, при несанкционированном изменении запроса на:
LoginForm%5Busername%5D[$testing]=myuser&LoginForm%5Bpassword%5D=mypass
возникает ошибка:
MongoDB Exception – yii\mongodb\Exception unknown operator: $testing
Это сообщение об ошибке указывает на то, что приложение пытается интерпретировать переменную $testing
как оператор, что и вызывает сбой.
Анализ: Является ли это NoSQL инъекцией?
Хотя в данном случае возникает ошибка, это не указывает на успешное выполнение NoSQL-инъекции. Ошибка связана с неправильным запросом к MongoDB, где $testing
интерпретируется как оператор, не поддерживаемый в MongoDB.
Основные моменты:
- Неудачная инъекция: Запрос не выполняется успешно, и ошибка указывает на отсутствие поддержки оператора.
- Несанкционированный доступ: Хотя попытка модификации данных имеет место, невозможно подтвердить наличие уязвимости без возможности выполнения произвольного кода или изменения состояния базы данных.
Возможность создания PoC, аналогичного команде Sleep
Вопреки распространенному мнению, хотя приведенный вами пример не приводит к успешной инъекции, теоретически возможно создание PoC (Proof of Concept), который может привести к задержкам или блокировке выполнения запросов. Например, если приложение не фильтрует входные данные должным образом, можно попытаться ввести оператор, который вызывает задержку.
Пример теоретической эксплуатации:
Если предположить, что ваше приложение не обрабатывает входные данные должным образом, можно попробовать ввести внутри запроса что-то вроде:
{ "username": { "$where": "sleep(5000)" }, "status": 10 }
При выполнении такого запроса, если ваша программа уязвима, она может на время «заснуть» (в данном случае, 5 секунд) перед тем, как вернуть ответ. Это выражает потенциальную уязвимость, которая может использоваться злоумышленниками для атаки на производительность вашего сервера.
Заключение
Итак, на основании указанной вами информации, попытка инъекции в MongoDB не увенчалась успехом и привела к системной ошибке. Однако это подчеркивает необходимость существования строгих механизмов валидации и фильтрации входных данных как первой линии защиты против возможных NoSQL-инъекций. Учитывая, что MongoDB позволяет операторные инъекции, критически важно принимать необходимые меры предосторожности для защиты ваших приложений.
Чтобы защитить свои системы, рекомендуется:
- Использовать параметры запросов вместо конкатенации строк.
- Реализовать строгую валидацию и фильтрацию входящих данных.
- Периодически проводить аудит кода и тестирование на уязвимости.
Оставаясь бдительным и внедряя безопасные практики, вы значительно снизите риски утечки данных и повышения общей безопасности ваших приложений.