Zer0must2b
Green Team
- 23.06.2019
- 306
- 141
В этом техническом сообщении в блоге мы рассмотрим, как диск с помощью эксплойта в выпуске Pimcore 6.2.0 позволяет злоумышленнику выполнять команды ОС, обманывая аутентифицированного администратора в использовании уязвимости внедрения команд.
Мы отсканировали Pimcore 6.2.0 и выявили несколько критических уязвимостей, включая уязвимость внедрения команд и уязвимость внедрения SQL, которые могут быть использованы для полного удаленного выполнения кода. Обе уязвимости были исправлены в Pimcore 6.2.1.
Усеченные результаты анализа доступны в нашем демонстрационном приложении RIPS. Обратите внимание, что мы ограничили результаты проблемами, описанными в этом посте, чтобы обеспечить исправление.
СМОТРИТЕ ОТЧЕТ RIPS
От Exif-данных к выполнению кода
Exiftool - это программа для Linux, которая позволяет манипулировать метаданными изображения, называемыми exif-данными . Всякий раз, когда PimCore обрабатывает изображение, выполняется команда оболочки для запуска сценария exiftool с именем файла изображения в качестве параметра. Для этого JSON-объект передается через GET-переменную, которой злоумышленник может управлять, чтобы вставить ее непосредственно в команду оболочки.
В строке 1063 downloadImageThumbnailAction()метода $configпараметр, хранящий объект JSON, принимается из HTTP-запроса, декодируется и сохраняется в $configпеременной. После проверки того, что изображение представляет собой JPEG, а сценарий exiftool установлен в строке 1068, $config['dpi']переменная внедряется в команду ОС без проверки и выполняется в строке 1070. Хотя $thumbnailFileпеременная корректно очищается путем ее передачи escapeshellarg(), разработчики PimCore не применил эту функцию к кнопке dpi$config параметра.
Подготовка массива: ключевое слово SQL's IN
Хотя Pimcore использует подготовленные операторы по всему приложению, мы могли бы подтвердить несколько SQL-инъекций, обнаруженных нашим сканером RIPS, требующих роли внутреннего пользователя, имеющего доступ к objectsразделу. Один из этих недостатков связан с уровнем абстрактной базы данных, который не обеспечивает прямой метод безопасного встраивания массива в запрос SQL. Часто разработчики испытывают потребность позволить пользователю предоставить список или массив идентификаторов, которые должны быть удалены, обновлены или выбраны. Чтобы решить эту проблему, они используют INключевое слово SQL . Теперь мы увидим пример того, как это может пойти не так:
addCollectionsAction() может быть вызван посредством маршрутизации непосредственно. Пользовательский ввод принимается через collectionIdsпараметр в строке 924. Затем отправляется массив идентификаторов implode(), преобразуя массив в разделенную запятыми строку его значений. Встроенная функция implode()не выполняет ни санацию, ни проверку, и поэтому результирующая строка не должна быть встроена непосредственно в запрос SQL, что делается в строке 930, ведущей к внедрению SQL.
Напротив, современные уровни абстракции базы данных создают оболочку вокруг prepare()метода PDO . Они подготовят запрос SQL, содержащий столько ?заполнителей, сколько имеется значений в массиве, и передадут потенциально вредоносный массив пользователя в качестве аргумента execute()методу PDOStatementэкземпляра.
Создание диска с помощью эксплойта
Отсутствующий токен CSRF позволяет злоумышленнику использовать уязвимости с помощью CSRF, что приводит к использованию эксплойта, когда администратор заманивает на вредоносную страницу, внедряющую форму, которая автоматически отправляется для отправки запроса на веб-страницу, включая файлы cookie администратор, позволяющий эксплуатировать удаленное выполнение кода. Чтобы использовать внедрение SQL, более сложная атака ( как показано здесь ) позволяет извлекать данные через побочные каналы.
Резюме
Внутренние уязвимости, описанные в этом сообщении в блоге, очерчивают дисбаланс между злоумышленниками, с одной стороны, - требующими только одну точку отказа, - и защитниками, с другой стороны, которые пропускают один недостаток в системе, приводящий к полному компромиссу. Угроза уязвимостей CSRF часто недооценивается, однако в целевых атаках, предпринимаемых решительными противниками, они представляют собой привлекательный шаг для вторжения в сеть и социальной инженерии. В этом конкретном случае мы хотели бы поблагодарить разработчиков Pimcore и с благодарностью оценить их осведомленность о безопасности благодаря их мгновенному ответу и устранению проблем.
Мы отсканировали Pimcore 6.2.0 и выявили несколько критических уязвимостей, включая уязвимость внедрения команд и уязвимость внедрения SQL, которые могут быть использованы для полного удаленного выполнения кода. Обе уязвимости были исправлены в Pimcore 6.2.1.
Усеченные результаты анализа доступны в нашем демонстрационном приложении RIPS. Обратите внимание, что мы ограничили результаты проблемами, описанными в этом посте, чтобы обеспечить исправление.
СМОТРИТЕ ОТЧЕТ 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переменная корректно очищается путем ее передачи escapeshellarg(), разработчики PimCore не применил эту функцию к кнопке dpi$config параметра.
Подготовка массива: ключевое слово SQL's IN
Хотя Pimcore использует подготовленные операторы по всему приложению, мы могли бы подтвердить несколько SQL-инъекций, обнаруженных нашим сканером RIPS, требующих роли внутреннего пользователя, имеющего доступ к objectsразделу. Один из этих недостатков связан с уровнем абстрактной базы данных, который не обеспечивает прямой метод безопасного встраивания массива в запрос SQL. Часто разработчики испытывают потребность позволить пользователю предоставить список или массив идентификаторов, которые должны быть удалены, обновлены или выбраны. Чтобы решить эту проблему, они используют INключевое слово 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. Затем отправляется массив идентификаторов implode(), преобразуя массив в разделенную запятыми строку его значений. Встроенная функция implode()не выполняет ни санацию, ни проверку, и поэтому результирующая строка не должна быть встроена непосредственно в запрос SQL, что делается в строке 930, ведущей к внедрению SQL.
Напротив, современные уровни абстракции базы данных создают оболочку вокруг prepare()метода PDO . Они подготовят запрос SQL, содержащий столько ?заполнителей, сколько имеется значений в массиве, и передадут потенциально вредоносный массив пользователя в качестве аргумента execute()методу PDOStatementэкземпляра.
Создание диска с помощью эксплойта
Отсутствующий токен CSRF позволяет злоумышленнику использовать уязвимости с помощью CSRF, что приводит к использованию эксплойта, когда администратор заманивает на вредоносную страницу, внедряющую форму, которая автоматически отправляется для отправки запроса на веб-страницу, включая файлы cookie администратор, позволяющий эксплуатировать удаленное выполнение кода. Чтобы использовать внедрение SQL, более сложная атака ( как показано здесь ) позволяет извлекать данные через побочные каналы.
Резюме
Внутренние уязвимости, описанные в этом сообщении в блоге, очерчивают дисбаланс между злоумышленниками, с одной стороны, - требующими только одну точку отказа, - и защитниками, с другой стороны, которые пропускают один недостаток в системе, приводящий к полному компромиссу. Угроза уязвимостей CSRF часто недооценивается, однако в целевых атаках, предпринимаемых решительными противниками, они представляют собой привлекательный шаг для вторжения в сеть и социальной инженерии. В этом конкретном случае мы хотели бы поблагодарить разработчиков Pimcore и с благодарностью оценить их осведомленность о безопасности благодаря их мгновенному ответу и устранению проблем.