В Modx Revolution обнаружено две критические уязвимости, подвержены все версии до 2.6.4 включительно. В данной статье проведу разбор только одной из них CVE-2018-1000207. По системе оценок уязвимостей CVSS уязвимость оценивается на 9.8 баллов AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H. Но если у вас версия выше 2.5.1 то оценка падает до 8.8, взломать вас гораздо сложнее, т.к. для экслуатация требуется авторизация в админ-панели (Privileges Required).

Уязвимость заключается в том что Modx передает пользовательские параметры в класс phpthumb без должной фильтрации. В качестве вектора атаки может использоваться скрипт /connectors/system/phpthumb.php, либо любой другой передающий параметры в класс modphpthumb.class.php. Например, если у вас установлен плагин Gallery (один из самых популярных плагинов для фотогалереи), то вектором атаки будет /assets/components/gallery/connector.php.

В случае если ваша версия CMS выше 2.5.1 и у вас не установлены никакие плагины позволяющие передавать параметры в phpthumb, то эксплуатации уязвимости будет требовать авторизации в админ-панели. К слову, достаточно авторизоваться под любым пользователем с любым уровнем доступа.

У класса phpthumb есть два вида параметров. public и private. Публичные параметры используются для указания параметров генерации превью пользователем, это «высота, ширина, качество, кроп, watermark итп».

// public:
// START PARAMETERS (for object mode and phpThumb.php)
// See phpthumb.readme.txt for descriptions of what each of these values are
public $src  = null;     // SouRCe filename
public $new  = null;     // NEW image (phpThumb.php only)
public $w    = null;     // Width
public $h    = null;     // Height
...

Приватные параметры более захардкожены и определяются в конфиг файле, к этим параметрам относятся: «режим дебага, указание директорий для кеша итп». Файл modxphpthumb.class.php через который уходят все запросы в phpthumb.class.php не видит различий между публичными и приватными параметрами и передает все без разбора.

Проблема в:

/* iterate through properties */
foreach ($this->config as $property => $value) {
    $this->setParameter($property,$value);
}
return true;

В $this->config попадают все запросы пользователя, которые после передаются в конфигурацию phpthumb через функцию setParameter(). Возможность использования всех параметров phpthumb позволяет загрузить на сайт любой PHP файл. Запрос с payload будет выглядить так:

url = target + '/connectors/system/phpthumb.php'
payload = {
    'ctx': 'web',
    'cache_filename': '../../payload.php',
...