Вопрос или проблема
Пожалуйста, объясните, как работает этот недавний эксплойт Cockpit CMS, особенно с использованием оператора $func библиотеки MongoLite, более подробно. Как именно это влияет на поведение PHP-кода?
Насколько я понимаю, PHP-код использует MongoLite для подключения к MongoDB, а уязвимость заключается в том, что PHP-код позволяет передавать массив в JSON/BSON вместо строки.
Массив использует $func для вызова var_dump и выводит переменную ‘user’, чтобы раскрыть все данные пользователя в базе данных.
- Разве Mongolite не является библиотекой для R?
- Как var_dump знает, что нужно считать переменную user? Как это выглядит в процессе выполнения PHP-кода и доступа к базе данных? После компрометации машины, похоже, он даже использует базу данных Sqlite3.
- NoSQLi становится режимом только для чтения после версии MongoDB 2.4?
По этому же поводу, не могли бы вы указать мне пример и ресурс о злоупотреблении встроенной обработкой ассоциативных массивов в PHP?
Я постараюсь ответить на ваши многочисленные вопросы по очереди.
-
Существует много проектов с таким же названием, эта библиотека PHP: https://github.com/agentejo/mongo-lite
-
Затронутый код (по ссылке в статье) вызывает любую вызываемую функцию PHP: https://github.com/agentejo/cockpit/blob/0.11.1/lib/MongoLite/Database.php#L434
private static function evaluate($func, $a, $b) {
...
<snip>
...
case '$func' :
case '$fn' :
case '$f' :
if (! \is_callable($b))
throw new \InvalidArgumentException('Function should be callable');
$r = $b($a);
break;
Где $b
— это значение ключа $func
, и я предполагаю, что $a
— это объект, на который мы ссылаемся (пользователь на основе JSON в POST-запросе).
- ??? Библиотека утверждает: “Схемобессонная база данных на основе SqLite”
Поскольку библиотека PHP вызывает любую вызываемую функцию, если вы сможете найти способ контролировать параметр, передаваемый в функцию, вы могли бы надежно вызвать shell_exec($a);
, чтобы выполнять команды вместо того, чтобы выводить дамп токенов сброса паролей и используя это значение для сброса пароля пользователя и входа с новым паролем, но может не быть хорошего способа контролировать аргумент, так что я оставлю это исследование другим.
Ответ или решение
Вопрос: Уязвимость NoSQLi в Cockpit CMS — использование оператора $func
Недавняя уязвимость Cockpit CMS, о которой идет речь, связана с реализацией библиотеки MongoLite, используемой для работы с базами данных MongoDB. Опасность возникает из-за того что некорректно обрабатываемые массивы в формате JSON или BSON позволяют злоумышленнику вызвать произвольный PHP-код через специальный оператор $func.
1. Как работает уязвимость?
При обработке данных в Cockpit CMS, где используется библиотека MongoLite, код позволяет передавать массивы в качестве входных параметров. Если злоумышленник подставит определённые параметры, библиотека объявляет переменные, которые могут быть интерпретированы как вызовы функций. В частности, код, предоставленный в библиотеке, позволяет выполнять вызов любой вызываемой функции на основе входящих данных.
Пример кода из библиотеки:
private static function evaluate($func, $a, $b) {
// ...предыдущий код...
case '$func':
case '$fn':
case '$f':
if (! \is_callable($b))
throw new \InvalidArgumentException('Function should be callable');
$r = $b($a);
break;
// ...следующий код...
}
В этом примере переменная $b
получает значение из массива, и если это значение является вызываемой функцией, то происходит ее вызов с переданным аргументом $a
.
2. Как var_dump
знает считывать переменную ‘user’?
При формировании запроса злоумышленник может манипулировать массивом таким образом, чтобы $b
указывал на функцию var_dump
, а $a
содержало объект пользователя или другую необходимую информацию. Таким образом, при вызове $b($a)
происходит выполнение var_dump($user)
, в результате чего из базы данных будет выведена вся информация о пользователе.
3. Использование SQLite после компрометации
Хотя в исходном коде библиотеки MongoLite подразумевается использование SQLite как основного хранилища, уязвимость может позволить зловредному пользователю выполнить произвольные команды, например, через shell_exec($a)
, если аргументы можно контролировать. Это открывает возможность не только получения данных, но и влияния на поведение системы.
4. Ограничения NoSQLi после версии MongoDB 2.4
Говоря о том, что NoSQL-инъекции стали "только чтением" после версии MongoDB 2.4, это связано с тем, что дальнейшие обновления стали учитывать множество критических уязвимостей и улучшили механизмы безопасности, тем самым ограничив возможности для выполнения нежелательных SQL-запросов.
Дополнительные ресурсы
По поводу использования встроенной обработки ассоциативных массивов в PHP, можно рекомендовать:
- Официальную документацию PHP: PHP Arrays
- Примеры использования ассоциативных массивов в PHP: PHP Associative Arrays
Таким образом, уязвимость, связанная с оператором $func, представляет серьезную угрозу безопасности, позволяющую выполнить произвольный PHP-код и скомпрометировать как базы данных, так и сервер. Это подчеркивает важность надлежащей обработки входных данных и регулярного обновления используемых библиотек.