Le 2 mars 2021, l’équipe Wordfence Threat Intelligence a divulgué de manière responsable une vulnérabilité de falsification des demandes intersites (CSRF) dans WP Fluent Forms, un plugin WordPress installé sur plus de 80 000 sites. Cette vulnérabilité a également permis une attaque stockée de type Cross-Site Scripting (XSS) qui, si elle était exploitée avec succès, pourrait être utilisée pour prendre le contrôle d’un site.
Nous avons contacté le développeur du plugin, WP Manage Ninja, le 2 mars 2021 et avons reçu une réponse dans les 24 heures. Nous avons envoyé la divulgation complète le 3 mars 2021 et une version corrigée du plugin, 3.6.67, a été publiée le 5 mars 2021.
Comme il n’était pas possible de bloquer les attaques contre cette vulnérabilité sans interférer avec les fonctionnalités de base du plugin, nous nous sommes abstenus de partager les détails de cette vulnérabilité jusqu’à ce que la majorité des sites l’utilisant soient à jour. Néanmoins, nous ne nous attendons pas à ce que cette vulnérabilité soit attaquée à grande échelle car elle nécessite une ingénierie sociale ciblée pour être exploitée.
Plugin concerné : WP Formes fluides
Plugin Slug : forme fluide
Versions concernées :
Identifiant CVE : CVE-2021-34620
Note CVSS : 7.1 (Élevé)
Vecteur CVSS : CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:L
Des chercheurs: Ramuel Gall
Version entièrement corrigée : 3.6.67
WP Fluent Forms est un plugin populaire qui permet aux propriétaires de sites de créer et de gérer facilement des formulaires de contact. Il utilise un grand nombre d’actions AJAX afin de modifier les paramètres globaux et d’effectuer la plupart des actions, et toutes les actions AJAX non publiques utilisent une seule méthode, Acl::verify
afin d’effectuer des contrôles de capacité sur ces actions.
public static function verify( $permission, $formId = null, $message="You do not have permission to perform this action.", $json = true ) { $allowed = self::hasPermission($permission, $formId); if (!$allowed) { if ($json) { wp_send_json_error([ 'message' => $message ], 422); } else { throw new Exception($message); } } } public static function hasPermission($permission, $formId = false) { if (current_user_can('fluentform_full_access')) { return true; } $allowed = current_user_can('fluentform_full_access'); if ($allowed) { return true; } if (is_array($permission)) { foreach ($permission as $eachPermission) { $allowed = current_user_can($eachPermission); if ($allowed) { return apply_filters('fluentform_verify_user_permission_' . $eachPermission, $allowed, $formId); } else { $isHookAllowed = apply_filters('fluentform_permission_callback', false, $eachPermission, $formId); if ($isHookAllowed) { return true; } } } return false; } $allowed = current_user_can($permission); $allowed = apply_filters('fluentform_verify_user_permission_' . $permission, $allowed, $formId); if ($allowed) { return true; } return apply_filters('fluentform_permission_callback', false, $permission, $formId); }
Malheureusement, cependant, toutes ces actions AJAX étaient vulnérables à la contrefaçon de requêtes intersites parce que le Acl::verify
la méthode n’a pas effectué de vérification de nonce, bien qu’elle ait utilisé une deuxième méthode, Acl::hasPermission
afin de terminer la vérification des capacités et de permettre des capacités personnalisées. En conséquence, il était possible de tromper un administrateur en lui envoyant une demande (par exemple, en cliquant sur un lien menant à une page contrôlée par un attaquant qui envoie une demande XHR ou contient un formulaire d’auto-soumission) pour apporter des modifications arbitraires au plugin . Cette attaque fonctionnerait également contre tout utilisateur ayant obtenu l’autorisation complète d’accéder aux paramètres du formulaire.
La conséquence la plus grave que nous ayons découverte a été la possibilité d’ajouter du JavaScript arbitraire à n’importe quel formulaire via le fluentform-save-form-custom_css_js
Action AJAX. Si du JavaScript malveillant était ajouté à un formulaire, il serait exécuté dans le navigateur de tout visiteur ayant accédé au formulaire. Si un administrateur visitait un tel formulaire, le JavaScript pourrait être utilisé pour créer un compte administratif malveillant supplémentaire ou pour ajouter une porte dérobée à un plugin ou à un fichier de thème.
Il était également possible pour un attaquant de tromper un administrateur pour qu’il accorde l’accès aux paramètres du plugin aux utilisateurs de niveau abonné via le fluentform_set_access_roles
Action AJAX. Pour que cela cause un préjudice réel, l’attaquant devrait avoir au moins un compte de niveau abonné sur le site ciblé et réussir à concevoir socialement un propriétaire de site vulnérable. Encore une fois, un attaquant abuserait très probablement de cet accès en ajoutant du code JavaScript malveillant à un formulaire sur le site.
Dans les deux cas, une attaque nécessiterait une ingénierie sociale ciblée et serait peu susceptible d’être exploitée à grande échelle. Cependant, il serait trivial de rediriger un administrateur vers un formulaire compromis immédiatement après l’avoir incité à envoyer la demande initiale, de sorte qu’on pourrait raisonnablement s’attendre à ce que toute attaque réussie de ce type par un adversaire compétent entraîne une prise de contrôle complète du site.
Chronologie
2 mars 2021 – L’équipe Wordfence Threat Intelligence termine la recherche de vulnérabilités dans WP Fluent Forms et prend contact avec le développeur du plugin, WP Manage Ninja.
3 mars 2021 – Nous recevons une réponse de WP Manage Ninja et envoyons la divulgation complète.
5 mars 2021 – Une version corrigée de WP Fluent Forms, 3.6.67, est publiée.
Conclusion
Dans l’article d’aujourd’hui, nous avons couvert une vulnérabilité Cross-Site Request Forgery (CSRF) dans WP Fluent Forms qui pourrait être utilisée pour effectuer une attaque Cross-Site Scripting (XSS) qui pourrait potentiellement conduire à une prise de contrôle du site. Cette vulnérabilité a été corrigée dans la version 3.6.67, et bien que la plupart des utilisateurs de ce plugin aient mis à jour vers une version corrigée, nous exhortons tous les utilisateurs restants qui n’ont pas mis à jour à mettre à jour vers la dernière version disponible dès que possible.
Source link