Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-32475 — Эксплойт proof-of-concept для CVE-2026-32475 — неаутентифицированная произвольная загрузка файлов в Elementor Pro, приводящая к удалённому выполнению кода. Включает автоматическое обнаружение, загрузку и выполнение команд с очисткой. | Kitploit
Инструменты/GitHubGitHub/sahmsec/cve-2026-32475
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеRed Teaming
GitHubsahmsec/cve-2026-32475

CVE-2026-32475

Эксплойт proof-of-concept для CVE-2026-32475 — неаутентифицированная произвольная загрузка файлов в Elementor Pro, приводящая к удалённому выполнению кода. Включает автоматическое обнаружение, загрузку и выполнение команд с очисткой.

Репозиторий
1191 месяц назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-32475 — Elementor Pro ≤ 4.2.1 Неаутентифицированная произвольная загрузка файлов → RCE

PoC для CVE-2026-32475 (CVSS 9.0 Critical, CWE-434): неаутентифицированная произвольная загрузка файлов в модуле Forms плагина Elementor Pro, приводящая к удалённому выполнению кода. Исправлено в Elementor Pro 4.2.2 (2026-08-19). Сообщено Tin Pham (TF1T) через программу Bug Bounty от Patchstack.

  ███████╗  █████╗  ██╗  ██╗ ███╗   ███╗ ███████╗ ███████╗  ██████╗
  ██╔════╝ ██╔══██╗ ██║  ██║ ████╗ ████║ ██╔════╝ ██╔════╝ ██╔════╝
  ███████╗ ███████║ ███████║ ██╔████╔██║ ███████╗ █████╗   ██║
  ╚════██║ ██╔══██║ ██╔══██║ ██║╚██╔╝██║ ╚════██║ ██╔══╝   ██║
  ███████║ ██║  ██║ ██║  ██║ ██║ ╚═╝ ██║ ███████║ ███████╗ ╚██████╗
  ╚══════╝ ╚═╝  ╚═╝ ╚═╝  ╚═╝ ╚═╝     ╚═╝ ╚══════╝ ╚══════╝  ╚═════╝

⚠️ Правовое предупреждение

Данный proof of concept предоставлен только для авторизованных исследований в области безопасности, обучения и защитного тестирования.

  • Вы должны владеть целевой системой или иметь явное письменное разрешение от владельца системы перед запуском этого инструмента против неё.
  • Несанкционированный доступ к компьютерным системам незаконен в большинстве юрисдикций (например, Computer Fraud and Abuse Act в США, Computer Misuse Act в Великобритании и аналогичные законы по всему миру) и может повлечь уголовную и гражданскую ответственность.
  • Авторы и участники не несут никакой ответственности за любое неправомерное использование, ущерб или юридические последствия, возникшие в результате использования этого кода.
  • Используя данное программное обеспечение, вы соглашаетесь использовать его ответственно и в соответствии со всеми применимыми законами.

В чём заключается уязвимость

Поле File Upload в формах Elementor Pro обрабатывает загруженные записи в двух отдельных циклах с разной семантикой (modules/forms/fields/upload.php):

// validation()
foreach ( $files[$id] as $index => $file ) {
    if ( ! $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
        return;                    // <-- прерывает ВЕСЬ метод
    }
    // is_file_type_valid() ...    // никогда не выполняется для записи #2
}

// process_field()
foreach ( $files[$id] as $index => $file ) {
    if ( UPLOAD_ERR_NO_FILE === $file['error'] ) {
        continue;                  // <-- пропускает только ЭТУ запись
    }
    $filename = uniqid() . '.' . $file_extension;   // расширение под контролем атакующего
    move_uploaded_file( $file['tmp_name'], $new_file );
}

Отправка двух файловых частей для одного и того же поля загрузки — пустой первой части (filename="" → UPLOAD_ERR_NO_FILE) с последующей .php нагрузкой — заставляет validation() вернуться до того, как блок-лист расширений увидит нагрузку, в то время как process_field() всё равно перемещает её в wp-content/uploads/elementor/forms/<uniqid()>.php, публичную веб-директорию. Прямой запрос этого URL = удалённое выполнение кода.

Загрузка обрабатывается через POST /wp-admin/admin-ajax.php (action=elementor_pro_forms_send_form) без аутентификации и без nonce. post_id, form_id и имя поля загрузки видны в HTML публичной страницы, поэтому вся атака неаутентифицирована.

Требования

Цель:

  • Elementor Pro ≤ 4.2.1 (все более старые версии уязвимы)
  • Как минимум одна опубликованная страница с виджетом Form, содержащим поле File Upload
  • Поле загрузки не должно быть помечено как Required (состояние по умолчанию)
  • Отсутствие CAPTCHA на форме (reCAPTCHA/turnstile блокирует неаутентифицированную отправку)
  • Директория загрузок должна выполнять PHP (по умолчанию на большинстве Apache/cPanel хостингов; заблокировано на некоторых усиленных конфигурациях nginx)

Атакующий:

  • Python 3.9+ (только стандартная библиотека — без зависимостей)
  • Сетевой доступ к цели

Использование

Одиночная цель (автоматическое обнаружение страницы формы через sitemap/главную страницу):

python script.py --url https://target.example --command "id; hostname; uname -a" --cleanup

Явная страница формы:

python script.py --url https://target.example --page-url https://target.example/contact/ --cleanup

Пакетный режим (sites.txt: по одному сайту на строку — base_url или base_url page_url):

python script.py --list sites.txt --command "id" --cleanup --out results.json

Формат JSON-списка:

[{"url": "https://a.example"}, {"url": "https://b.example", "page_url": "https://b.example/jobs/"}]

Выполнение команды на уже загруженной оболочке:

python script.py --url https://target.example --shell-url https://target.example/wp-content/uploads/elementor/forms/<name>.php --command "id"

Ключевые опции

ФлагПо умолчаниюНазначение
--url-базовый URL одиночной цели
--list-файл списка для пакетного режима
--page-url--urlстраница, содержащая форму
--commandid; hostname; uname -aкоманда для выполнения через оболочку
--cleanupвыкл.самоудаление веб-оболочки после тестирования
--field k=v-переопределить автозаполняемое поле формы (повторяемый)
--tail0.3секунд до расчётного времени загрузки для точного сканирования
--step-fine1шаг точного сканирования в микросекундах
--full-secondвыкл.перебор полной секунды uniqid (обходит расхождение часов)
--attempts1попытки загрузки+сканирования (новое случайное имя файла каждый раз)
--max-probes600000бюджет запросов сканирования на попытку
--workers50параллельные потоки сканирования
--insecureвыкл.игнорировать ошибки TLS (цели с самоподписанными сертификатами)
--out file.json-записать отчёт в формате JSON

Как работает инструмент

  1. Обнаружение — загружает целевую страницу (или обходит sitemap и ссылки главной страницы, максимум 20 страниц), чтобы найти форму с полем File Upload.
  2. Сбор данных — извлекает post_id, form_id, имя поля загрузки и все остальные поля формы; автоматически заполняет все поля правдоподобными значениями, чтобы обязательные поля прошли валидацию (переопределите с помощью --field).
  3. Загрузка — отправляет двухчастный multipart POST на admin-ajax.php. Примечание: success:false с пустым объектом errors всё равно считается загруженным, потому что действие Email по умолчанию вызывает ошибку после перемещения файла, когда wp_mail() завершается неудачей. Только отклонение самого поля загрузки (file type is not allowed) считается блокировкой.
  4. Восстановление имени файла — uniqid() = 8 шестнадцатеричных секунд + 5 шестнадцатеричных микросекунд. Секунды берутся из заголовка Date ответа; доли секунды оцениваются как (t1 - date_epoch) % 1 (точно, когда часы атакующего и сервера близки). Пробер с keep-alive (~в 30 раз быстрее, чем один запрос на соединение) сканирует окно перемещения с разрешением в микросекунды; --full-second перебирает всю секунду при расхождении часов.
  5. Выполнение — GET <shell>?c=<command> выполняет команду; --cleanup удаляет оболочку через ?x=1.

Состояния результатов

СтатусЗначение
vulnerableоболочка загружена и команда выполнена — немедленно обновитесь
blockedполе загрузки отклонено (исправлено в 4.2.2+, обязательное поле, WAF, капча)
uploaded_no_execфайл размещён, но имя файла не восстановлено (повторите с --full-second)
no_formуязвимая форма на цели не найдена
errorошибка соединения/сети

Воспроизведение в лаборатории

docker-compose.yml + setup_form_page.php воспроизводят уязвимую цель:

Скачать инструмент