• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Гостевая статья Drive By RCE Exploit в Pimcore 6.2.0

В этом техническом сообщении в блоге мы рассмотрим, как диск с помощью эксплойта в выпуске Pimcore 6.2.0 позволяет злоумышленнику выполнять команды ОС, обманывая аутентифицированного администратора в использовании уязвимости внедрения команд.

driveby-rce-exploit-pimcore.png



Мы отсканировали Pimcore 6.2.0 и выявили несколько критических уязвимостей, включая уязвимость внедрения команд и уязвимость внедрения SQL, которые могут быть использованы для полного удаленного выполнения кода. Обе уязвимости были исправлены в Pimcore 6.2.1.

Усеченные результаты анализа доступны в нашем демонстрационном приложении RIPS. Обратите внимание, что мы ограничили результаты проблемами, описанными в этом посте, чтобы обеспечить исправление.



От Exif-данных к выполнению кода
Exiftool - это программа для Linux, которая позволяет манипулировать метаданными изображения, называемыми exif-данными . Всякий раз, когда PimCore обрабатывает изображение, выполняется команда оболочки для запуска сценария exiftool с именем файла изображения в качестве параметра. Для этого JSON-объект передается через GET-переменную, которой злоумышленник может управлять, чтобы вставить ее непосредственно в команду оболочки.

PHP:
public function downloadImageThumbnailAction(Request $request)
{
    /*...*/
    $config = $this->decodeJson($request->get('config'));
    /*...*/
    $thumbnailConfig->setFormat($config['format']);
    /*...*/
    $exiftool = \Pimcore\Tool\Console::getExecutable('exiftool');
    if ($thumbnailConfig->getFormat() == 'JPEG' && $exiftool
    && isset($config['dpi']) && $config['dpi']) {
        \Pimcore\Tool\Console::exec($exiftool .
        ' -overwrite_original -xresolution=' . $config['dpi'] .
        ' -yresolution=' . $config['dpi'] . ' -resolutionunit=inches ' .
        escapeshellarg($thumbnailFile));
}


В строке 1063 downloadImageThumbnailAction()метода $configпараметр, хранящий объект JSON, принимается из HTTP-запроса, декодируется и сохраняется в $configпеременной. После проверки того, что изображение представляет собой JPEG, а сценарий exiftool установлен в строке 1068, $config['dpi']переменная внедряется в команду ОС без проверки и выполняется в строке 1070. Хотя $thumbnailFileпеременная корректно очищается путем ее передачи , разработчики PimCore не применил эту функцию к кнопке dpi$config параметра.

Подготовка массива: ключевое слово SQL's IN
Хотя Pimcore использует подготовленные операторы по всему приложению, мы могли бы подтвердить несколько SQL-инъекций, обнаруженных нашим сканером RIPS, требующих роли внутреннего пользователя, имеющего доступ к objectsразделу. Один из этих недостатков связан с уровнем абстрактной базы данных, который не обеспечивает прямой метод безопасного встраивания массива в запрос SQL. Часто разработчики испытывают потребность позволить пользователю предоставить список или массив идентификаторов, которые должны быть удалены, обновлены или выбраны. Чтобы решить эту проблему, они используют ключевое слово SQL . Теперь мы увидим пример того, как это может пойти не так:

PHP:
public function addCollectionsAction(Request $request)
{
    $this->checkPermission('objects');
    $ids = $this->decodeJson($request->get('collectionIds'));
    /*...*/
    if ($ids) {
        $db = \Pimcore\Db::get();
        $query = 'select * from classificationstore_groups g,
            classificationstore_collectionrelations c where colId IN ('
            . implode(',', $ids)
            . ') and g.id = c.groupId';
        /*...*/
        $groupsData = $db->fetchAll($query);


addCollectionsAction() может быть вызван посредством маршрутизации непосредственно. Пользовательский ввод принимается через collectionIdsпараметр в строке 924. Затем отправляется массив идентификаторов , преобразуя массив в разделенную запятыми строку его значений. Встроенная функция не выполняет ни санацию, ни проверку, и поэтому результирующая строка не должна быть встроена непосредственно в запрос SQL, что делается в строке 930, ведущей к внедрению SQL.

Напротив, современные уровни абстракции базы данных создают оболочку вокруг метода PDO . Они подготовят запрос SQL, содержащий столько ?заполнителей, сколько имеется значений в массиве, и передадут потенциально вредоносный массив пользователя в качестве аргумента методу PDOStatementэкземпляра.

Создание диска с помощью эксплойта
Отсутствующий токен CSRF позволяет злоумышленнику использовать уязвимости с помощью CSRF, что приводит к использованию эксплойта, когда администратор заманивает на вредоносную страницу, внедряющую форму, которая автоматически отправляется для отправки запроса на веб-страницу, включая файлы cookie администратор, позволяющий эксплуатировать удаленное выполнение кода. Чтобы использовать внедрение SQL, более сложная атака ( ) позволяет извлекать данные через побочные каналы.

Резюме
Внутренние уязвимости, описанные в этом сообщении в блоге, очерчивают дисбаланс между злоумышленниками, с одной стороны, - требующими только одну точку отказа, - и защитниками, с другой стороны, которые пропускают один недостаток в системе, приводящий к полному компромиссу. Угроза уязвимостей CSRF часто недооценивается, однако в целевых атаках, предпринимаемых решительными противниками, они представляют собой привлекательный шаг для вторжения в сеть и социальной инженерии. В этом конкретном случае мы хотели бы поблагодарить разработчиков Pimcore и с благодарностью оценить их осведомленность о безопасности благодаря их мгновенному ответу и устранению проблем.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!