MongoDB NoSQL в Cockpit CMS – использование $func?

Вопрос или проблема

Пожалуйста, объясните, как работает этот недавний эксплойт 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?

Я постараюсь ответить на ваши многочисленные вопросы по очереди.

  1. Существует много проектов с таким же названием, эта библиотека PHP: https://github.com/agentejo/mongo-lite

  2. Затронутый код (по ссылке в статье) вызывает любую вызываемую функцию 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-запросе).

  1. ??? Библиотека утверждает: “Схемобессонная база данных на основе 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-код и скомпрометировать как базы данных, так и сервер. Это подчеркивает важность надлежащей обработки входных данных и регулярного обновления используемых библиотек.

Оцените материал
Добавить комментарий

Капча загружается...