
Writeup et preuve de concept de CVE-2026-2002
Le plugin Forminator Forms – Contact Form, Payment Form & Custom Form Builder pour WordPress est vulnérable à un Cross-Site Scripting stocké via le paramètre form_name dans toutes les versions jusqu’à la 1.50.2 incluse, en raison d’un assainissement insuffisant des entrées et d’un échappement insuffisant des sorties. Cela permet à des attaquants authentifiés, disposant d’un accès de niveau administrateur, d’injecter des scripts web arbitraires dans des pages qui s’exécuteront dès qu’un utilisateur accédera à une page compromise. Le plugin permet aux administrateurs d’accorder des permissions de gestion des formulaires à des utilisateurs de niveau inférieur, ce qui pourrait rendre cette vulnérabilité exploitable par des utilisateurs tels que les abonnés.
La cause racine est un problème qui nécessite une fine conscience des bugs logiques : (Cette fonction dans le fichier /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;
}
Ce code utilise une fonction de nettoyage (wp_kses_post) pour protéger contre les XSS des utilisateurs à privilèges réduits, mais le problème est qu’il nettoie avant de remplacer les variables. Par conséquent, un attaquant disposant des privilèges appropriés peut utiliser des balises HTML valides pour contourner wp_kses_post et injecter la charge utile JavaScript dans les variables afin de déclencher une XSS.
Un attaquant disposant du privilège Edit Form peut insérer un HTML dans un champ HTML comme ceci :
Et ensuite modifier le form_name en :
javascript:alert(1) or javascript:<Payload>
| Score | Gravité | Version | Chaîne de vecteur |
|---|---|---|---|
| 4.4 | MOYENNE | 3.1 | CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N |
À mon avis, ce bug, bien qu’il n’ait pas une grande sévérité, nécessite une grande finesse de compréhension dans la logique et la revue de code : comme vous pouvez le voir, une simple erreur entre deux lignes de code suffit à créer une vulnérabilité.

Si vous accrochez avec ce type de recherche et souhaitez soutenir de futures explorations, vous pouvez faire un don et me soutenir. Je vous remercie de votre contribution.
╰(°▽°)╯