
Writeup su CVE-2026-2002 e prova di concetto
Il plugin per WordPress Forminator Forms – Contact Form, Payment Form & Custom Form Builder è vulnerabile a Cross-Site Scripting memorizzato (Stored XSS) tramite il parametro form_name in tutte le versioni fino alla 1.50.2 inclusa, a causa di una sanitizzazione dell'input e di un escaping dell'output insufficienti. Ciò consente ad attaccanti autenticati, con accesso a livello di amministratore, di iniettare script web arbitrari nelle pagine, che verranno eseguiti ogni volta che un utente accede a una pagina iniettata. Il plugin consente agli amministratori di dare i permessi di gestione dei moduli a utenti di livello inferiore, il che potrebbe rendere questo problema sfruttabile da utenti come i lettori.
La causa principale è qualcosa che richiede una certa finezza nella consapevolezza dei bug logici: (Questa funzione nel file /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;
}
Questo codice qui usa una funzione di sanitizzazione (wp_kses_post) per proteggere gli utenti con privilegi inferiori dagli XSS, ma il problema è che sanitizza prima di sostituire le variabili. Di conseguenza, un attaccante con i privilegi appropriati può usare tag HTML validi per aggirare wp_kses_post e iniettare il payload JavaScript nelle variabili al fine di innescare l'XSS.
Un attaccante con il privilegio Edit Form può inserire un HTML in un campo HTML in questo modo:
E poi cambiare il form_name in:
javascript:alert(1) or javascript:<Payload>
| Punteggio | Gravità | Versione | Stringa del vettore |
|---|---|---|---|
| 4.4 | MEDIUM | 3.1 | CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N |
A mio parere, questo bug, anche se non ha una grande gravità, richiede una certa finezza nella consapevolezza della logica e nella revisione del codice: come puoi vedere, basta un piccolo errore tra due righe di codice e si crea una vulnerabilità.
Se questo tipo di ricerca ti affascina e vuoi sostenere ulteriori approfondimenti, puoi fare una donazione e supportarmi. Apprezzo il tuo contributo.
╰(°▽°)╯