Плагин WordPress wp-downloadmanager в версии 1.68.11 (также влияет на выпуск 6.9.4) позволяет пользователю с правами администратора (current_user_can('manage_downloads')) загружать произвольные файлы через download-add.php без какой-либо проверки расширения или MIME-типа - никакие wp_check_filetype_and_ext(), validate_file() и черный список расширений не существуют нигде в обработчик загрузки. Путь назначения дополнительно создается путем объединения необработанного, необработанного значения $_POST['file_upload_to'] без проверки прохождения (без фильтрации ../, без применения basename()/realpath()). Поскольку базовый путь загрузки должен находиться в каталоге WP_CONTENT_DIR (доступное через Интернет расположение), загруженный файл PHP попадает в путь, доступный через веб-сервер, и может быть выполнен напрямую, что приводит к удаленному выполнению кода.
Более поздний журнал изменений плагина подтверждает, что эти средства защиты отсутствовали в этой версии: в версии 1.69 добавлена проверка типа файла с помощью wp_check_filetype_and_ext(), а в версии 1.69.1 добавлена защита от обхода каталогов — ни того, ни другого не существовало в 1.68.11.
Показать оригинальное описание (EN)
The wp-downloadmanager WordPress plugin, in version 1.68.11 (also affecting the 6.9.4 release line), allows an admin-privileged user (current_user_can('manage_downloads')) to upload arbitrary files via download-add.php with no extension or MIME-type validation of any kind - no wp_check_filetype_and_ext(), no validate_file(), and no extension blocklist exist anywhere in the upload handler. The destination path is additionally built by concatenating the raw, unsanitized $_POST['file_upload_to'] value with no traversal check (no ../ filtering, no basename()/realpath() applied). Since the base download path is required to live under WP_CONTENT_DIR (a web-accessible location), an uploaded PHP file lands in a web-servable path and can be directly executed, resulting in remote code execution. The plugin's own later changelog confirms these protections were absent in this version: v1.69 added file-type validation via wp_check_filetype_and_ext(), and v1.69.1 added directory-traversal protection - neither existed in 1.68.11.
Характеристики атаки
Последствия
Строка CVSS v3.1