
Разбор CVE-2026-2002 и доказательство концепции
Плагин Forminator Forms – Contact Form, Payment Form & Custom Form Builder для WordPress уязвим к хранимому межсайтовому скриптингу через параметр form_name во всех версиях до 1.50.2 включительно из-за недостаточной санитизации ввода и экранирования вывода. Это позволяет аутентифицированным злоумышленникам с доступом уровня администратора внедрять произвольные веб-скрипты на страницы, которые будут выполняться при каждом обращении пользователя к затронутой странице. Плагин позволяет администраторам предоставлять права управления формами пользователям с более низким уровнем доступа, что делает уязвимость эксплуатируемой такими пользователями, как подписчики.
Корневая причина требует тонкого понимания логических ошибок: (Эта функция находится в файле /fields/html.php)
public function markup( $field, $views_obj ) {
$settings = $views_obj->model->settings;
$html = '';
$label = esc_html( self::get_property( 'field_label', $field ) );
$id = self::get_property( 'element_id', $field );
$form_id = false;
$html .= '<div class="forminator-field forminator-merge-tags" data-field="' . $id . '">';
if ( $label ) {
$html .= sprintf(
'<label class="forminator-label">%s</label>',
self::convert_markdown( $label )
);
}
// Check if form_id exist.
if ( isset( $settings['form_id'] ) ) {
$form_id = $settings['form_id'];
}
// To allow iframes in content.
add_filter( 'wp_kses_allowed_html', array( 'Forminator_Core', 'add_iframe_to_kses_allowed_html' ) );
$content = wp_kses_post( self::get_property( 'variations', $field ) ); // root cause here
remove_filter( 'wp_kses_allowed_html', array( 'Forminator_Core', 'add_iframe_to_kses_allowed_html' ) );
$html .= forminator_replace_variables(
$content,
$form_id
);
$html .= '</div>';
return $html;
}
Этот код использует функцию санитизации (wp_kses_post) для защиты от XSS со стороны пользователей с низкими привилегиями, но проблема в том, что санитизация выполняется до замены переменных. В результате злоумышленник с соответствующими привилегиями может использовать допустимые HTML-теги, чтобы обойти wp_kses_post и внедрить JavaScript-нагрузку в переменные, вызывая XSS.
Злоумышленник с правом редактирования формы может вставить следующий HTML в HTML-поле:
А затем изменить form_name на:
javascript:alert(1) or javascript:<Payload>
| Балл | Серьёзность | Версия | Векторная строка |
|---|---|---|---|
| 4.4 | MEDIUM | 3.1 | CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N |
На мой взгляд, эта уязвимость, хотя и не имеет высокой степени серьёзности, требует тонкого понимания логики и внимательности при ревью кода: как видите, небольшая ошибка между двумя строками кода создаёт уязвимость.

Если вам близок такой стиль исследований и вы хотите поддержать дальнейшие раскопки, вы можете сделать пожертвование и поддержать меня. Я ценю ваш вклад.
╰(°▽°)╯