Le 11 février 2021, notre équipe Threat Intelligence a divulgué de manière responsable plusieurs vulnérabilités dans Redirection pour le formulaire de contact 7, un plugin WordPress utilisé par plus de 200 000 sites. L’une de ces failles permettait à des attaquants non authentifiés de générer des nonces arbitraires pour n’importe quelle fonction. La deuxième faille a permis aux attaquants authentifiés d’installer des plugins arbitraires et d’injecter des objets PHP. La troisième faille a permis à des attaquants authentifiés de supprimer des publications arbitraires sur un site exécutant le plugin entraînant une perte de disponibilité.
Nous avons d’abord contacté le développeur du plugin le 11 février 2021. Après avoir établi un canal de communication approprié, nous avons fourni la divulgation complète le lendemain 12 février 2021. Les développeurs du plugin ont rapidement publié un correctif le lendemain 13 février. , 2021.
Ceux-ci sont considérés comme des vulnérabilités graves. Par conséquent, nous vous recommandons vivement de mettre à jour immédiatement vers la dernière version corrigée disponible, 2.3.5.
Les utilisateurs de Wordfence Premium ont reçu une règle de pare-feu pour se protéger contre tout exploit visant ces vulnérabilités le 11 février 2021. Les sites utilisant toujours la version gratuite de Wordfence ont reçu la même protection le 13 mars 2021.
Plugin concerné: Redirection pour le formulaire de contact 7
Plugin Slug: redirection wpcf7
Versions concernées:
ID CVE: En attente.
Score CVSS: 5,3 (moyen)
Vecteur CVSS: CVSS: 3.1 / AV: N / AC: L / PR: N / UI: N / S: U / C: L / I: N / A: N
Version entièrement corrigée: 2.3.4
Redirection for Contact Form 7 est un plugin conçu pour ajouter des redirections aux formulaires créés avec le populaire plugin Contact Form 7 afin que les utilisateurs puissent être redirigés immédiatement après avoir soumis un formulaire. Le plugin offre plusieurs fonctionnalités telles que la possibilité de personnaliser les redirections, les paramètres d’importation, etc.
En examinant le code du plugin, nous avons découvert une action nopriv AJAX qui n’était réellement utilisée nulle part dans le plugin, wp_ajax_nopriv_wpcf7r_get_nonce
, qui était accroché à la wpcf7r_get_nonce
fonction et a permis de générer des nonces.
add_action( 'wp_ajax_nopriv_wpcf7r_get_nonce', array( $this, 'wpcf7r_get_nonce' ) ); add_action( 'wp_ajax_wpcf7r_get_nonce', array( $this, 'wpcf7r_get_nonce' ) );
public function wpcf7r_get_nonce() { $nonce_action = isset( $_POST['param'] ) && wp_unslash( sanitize_text_field( $_POST['param'] ) ) ? wp_unslash( sanitize_text_field( $_POST['param'] ) ) : ''; $nonce = wp_create_nonce( $nonce_action ); wp_send_json_success( array( 'nonce' => $nonce ) ); }
Plus précisément, un utilisateur peut définir le param
value à n’importe quelle valeur lors du déclenchement de l’action AJAX. le param
valeur serait alors fournie au wp_create_nonce()
fonctionner comme valeur d’action et créer un nonce valide pour toute action, que l’utilisateur soit connecté ou non en raison de l’utilisation d’un nopriv
Action AJAX. La fonction renverrait alors le nonce nouvellement généré à l’utilisateur.
À première vue, cela ne semble pas être une vulnérabilité significative. Cependant, il existe un certain nombre de plugins dans le référentiel WordPress qui utilisent de manière non sécurisée les vérifications nonce comme un substitut aux vérifications de capacités lors de l’application du contrôle d’accès. Malheureusement, cela signifiait que cette vulnérabilité de génération de nonce arbitraire pouvait être utilisée par tout utilisateur non authentifié pour créer un nonce valide. Ce nonce valide pourrait alors leur accorder l’accès à des fonctions sensibles dans n’importe quel plugin qui utilisait des vérifications de nonce comme seul moyen de contrôle d’accès.
Les attaquants pourraient utiliser cette vulnérabilité de génération nonce pour effectuer une pléthore d’actions malveillantes, y compris la prise de contrôle complète du site en fonction des autres plugins installés sur le site.
Plugin concerné: Redirection pour le formulaire de contact 7
Plugin Slug: redirection wpcf7
Versions concernées:
ID CVE: En attente.
Score CVSS: 5,4 (moyen)
Vecteur CVSS: CVSS: 3.1 / AV: N / AC: L / PR: L / UI: N / S: U / C: L / I: L / A: N
Version entièrement corrigée: 2.3.4
Une fonctionnalité offerte par Redirection for Contact Form 7 est la possibilité d’importer des formulaires Contact Form 7 avec leurs paramètres de redirection ainsi que des plugins via leur fonction d’importation de débogage. Malheureusement, cette fonctionnalité n’a pas été mise en œuvre de manière sécurisée.
Le plugin a enregistré l’action AJAX wp_ajax_import_from_debug
, qui était lié à la import_from_debug
une fonction. Cette fonction n’avait pas de contrôle de capacité, ni de protection nonce, ce qui permettait à un utilisateur authentifié sur un site, y compris ceux qui n’avaient que des privilèges de niveau abonné, de déclencher l’action AJAX et d’utiliser la fonctionnalité de la fonctionnalité.
add_action( 'wp_ajax_import_from_debug', array( $this->wpcf7_utils, 'import_from_debug' ) );
public function import_from_debug() { $data = isset( $_POST['data'] ) && $_POST['data'] ? $_POST['data'] : ''; if ( $data ) { $formdata = unserialize( base64_decode( $data['debug_info'] ) ); $this->install_plugins( json_decode( $formdata['plugins'] ) ); $form_id = $this->import_form( $formdata ); $this->import_actions( $form_id, $formdata['actions'] ); } }
Toutes les données nécessaires pour effectuer l’importation peuvent être fournies par un utilisateur via le paramètre «data» sous forme de données sérialisées encodées en base64. Si le paramètre ‘data’ a été fourni, alors la fonction décode en base64 et désérialise les données et stocke les données comme $formdata
. Si ‘plugins’ était contenu dans le $formdata
, alors la fonction déclencherait le install_plugins()
fonction qui vérifierait si l’un des plugins demandés était déjà installé et activé. Si l’un des plugins demandés n’était pas déjà installé, alors le install_plugins()
la fonction déclencherait le install_plugin()
fonction pour les installer et les activer.
/** * Install and activate a plugin * * @return void */ public function install_plugin( $plugin_slug ) { $api = plugins_api( 'plugin_information', array( 'slug' => basename( $plugin_slug, '.php' ), 'fields' => array( 'short_description' => false, 'sections' => false, 'requires' => false, 'rating' => false, 'ratings' => false, 'downloaded' => false, 'last_updated' => false, 'added' => false, 'tags' => false, 'compatibility' => false, 'homepage' => false, 'donate_link' => false, ), ) ); if ( ! is_wp_error( $api ) ) { $upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( compact( 'title', 'url', 'nonce', 'plugin', 'api' ) ) ); $upgrader->install( $api->download_link ); if ( ! is_wp_error( $upgrader->skin->api ) ) { return activate_plugin( $plugin_slug ); } else { return $upgrader->skin->api; } } else { return $api; }
Cela signifiait que les utilisateurs authentifiés avec des autorisations très minimales, comme les abonnés, pouvaient utiliser cette vulnérabilité pour installer n’importe quel plugin à partir du référentiel WordPress. Un attaquant pourrait utiliser cela pour installer des plugins contenant des vulnérabilités non divulguées ou d’autres faiblesses et les utiliser pour prendre le contrôle d’un site. Par exemple, ils pourraient installer un plugin qui utilise de manière non sécurisée la protection nonce pour le contrôle d’accès et le combiner avec la vulnérabilité de génération précédente nonce pour exploiter davantage un site.
Plugin concerné: Redirection pour le formulaire de contact 7
Plugin Slug: redirection wpcf7
Versions affectées:
ID CVE: En attente.
Score CVSS: 7,5 (élevé)
Vecteur CVSS: CVSS: 3.1 / AV: N / AC: H / PR: L / UI: N / S: U / C: H / I: H / A: H
Version entièrement corrigée: 2.3.4
En plus de la vulnérabilité d’installation arbitraire du plugin, le import_from_debug
La fonction était également vulnérable à l’injection d’objets PHP. Comme mentionné précédemment, le import_from_debug
La fonction prend le paramètre ‘data’ fourni par l’utilisateur comme des données sérialisées et encodées en base64. Lorsqu’elle est fournie, la fonction base64 a décodé et désérialisé ces données.
public function import_from_debug() { $data = isset( $_POST['data'] ) && $_POST['data'] ? $_POST['data'] : ''; if ( $data ) { $formdata = unserialize( base64_decode( $data['debug_info'] ) ); $this->install_plugins( json_decode( $formdata['plugins'] ) ); $form_id = $this->import_form( $formdata ); $this->import_actions( $form_id, $formdata['actions'] ); } }
La désérialisation des données fournies par l’utilisateur permet aux utilisateurs de fournir des objets PHP dans une requête pour déclencher l’exécution d’autres classes PHP. Malheureusement, cela signifie que s’il existe une méthode magique appropriée, les attaquants peuvent faire des choses comme l’exécution de code à distance et la création arbitraire de fichiers pour prendre complètement le contrôle d’un site WordPress vulnérable.
Nous n’avons trouvé aucune méthode magique utilisable dans ce plugin qui aiderait à exploiter davantage cette vulnérabilité, cependant, la vulnérabilité d’installation de plugin arbitraire pourrait être utilisée pour installer un plugin qui contenait une méthode magique utilisable créant une chaîne POP complète pour que les attaquants puissent exploit.
Une méthode magique est une fonction PHP spéciale qui est ajoutée à une classe pour effectuer une action lorsque certaines conditions sont remplies, comme la désérialisation des données. Les méthodes magiques sont généralement utilisées pour faire des choses comme supprimer des fichiers, créer des fichiers, exécuter des commandes, etc., c’est pourquoi elles sont utilisées avec les vulnérabilités d’injection d’objets PHP pour effectuer des actions nuisibles sur le serveur d’un site cible. Pour plus d’informations sur le fonctionnement de l’injection d’objets PHP et des méthodes magiques, veuillez voir ce post.
Plugin concerné: Redirection pour le formulaire de contact 7
Plugin Slug: redirection wpcf7
Versions concernées:
ID CVE: En attente.
Score CVSS: 4,2 (moyen)
Vecteur CVSS: CVSS: 3.1 / AV: N / AC: H / PR: L / UI: N / S: U / C: N / I: L / A: L
Version entièrement corrigée: 2.3.4
La redirection pour Contact Form 7 enregistre les redirections et autres fonctionnalités comme des «actions». Vous pouvez facilement créer, dupliquer et supprimer ces actions de n’importe quel formulaire de contact à tout moment. Afin de fournir la fonctionnalité de suppression, le plugin a enregistré le wp_ajax_wpcf7r_delete_action
Action AJAX accrochée à la delete_action_post
une fonction.
add_action( 'wp_ajax_wpcf7r_delete_action', array( $this->wpcf7_utils, 'delete_action_post' ) );
/** * Delete an action */ public function delete_action_post() { $data = isset( $_POST['data'] ) ? $_POST['data'] : ''; $response['status'] = 'failed'; if ( $data ) { foreach ( $data as $post_to_delete ) { if ( $post_to_delete ) { wp_trash_post( $post_to_delete['post_id'] ); $response['status'] = 'deleted'; } } } wp_send_json( $response ); }
le delete_action_post
vérifie le fonctionnement du data
Paramètre POST, et si les données contiennent un ‘post_id’, elles utilisent le wp_trash_post()
fonction pour supprimer l’identifiant de publication correspondant.
Malheureusement, il n’y avait pas de vérification de capacité pour cette action, ni de protection nonce, permettant à tout utilisateur authentifié, y compris ceux avec des autorisations minimales comme un abonné, de supprimer toute publication sur un site WordPress vulnérable. Cela pourrait entraîner une perte de disponibilité.
Plugin concerné: Redirection pour le formulaire de contact 7
Plugin Slug: redirection wpcf7
Versions concernées:
ID CVE: En attente.
Score CVSS: 5,0 (moyen)
Vecteur CVSS: CVSS: 3.1 / AV: N / AC: H / PR: L / UI: N / S: U / C: L / I: L / A: L
Version entièrement corrigée: 2.3.4
En plus des quatre vulnérabilités détaillées ci-dessus, il restait quelques actions AJAX qui n’étaient pas protégées par des vérifications de capacités et des nonces, ce qui permettait aux utilisateurs de niveau inférieur de les exécuter. Les actions AJAX restantes étaient nettement moins sévères, cependant, les attaquants pouvaient faire des choses comme réinitialiser les paramètres du plugin, ajouter des actions, supprimer des actions, etc.
Calendrier de divulgation
11 février 2021 – Conclusion de l’analyse du plugin qui a conduit à la découverte de plusieurs vulnérabilités dans le plugin Redirection for Contact Form 7. Nous développons des règles de pare-feu pour protéger les clients de Wordfence et les diffusons aux utilisateurs de Wordfence Premium. Nous prenons contact avec le développeur du plugin.
12 février 2021 – Le développeur du plugin confirme la boîte de réception pour gérer la discussion le lendemain. Nous envoyons une divulgation complète.
13 février 2021 – Une version récemment mise à jour de Redirection for Contact Form 7 est publiée, contenant des correctifs pour toutes les vulnérabilités.
15 février 2021 – Nous confirmons que les vulnérabilités ont été corrigées.
13 mars 2021 – Les utilisateurs gratuits de Wordfence reçoivent des règles de pare-feu.
Conclusion
Dans l’article d’aujourd’hui, nous avons détaillé plusieurs failles dans Redirection for Contact Form 7 qui permettaient aux attaquants de générer des nonces, d’installer des plugins arbitraires, de supprimer des publications arbitraires et d’injecter des objets PHP pour exécuter du code. Ces failles ont été entièrement corrigées dans la version 2.3.4. Nous recommandons aux utilisateurs de mettre immédiatement à jour vers la dernière version disponible, qui est la version 2.3.5 au moment de cette publication.
Wordfence Premium les utilisateurs ont reçu des règles de pare-feu protégeant contre ces vulnérabilités le 11 février 2021, tandis que ceux qui utilisent encore la version gratuite de Wordfence ont reçu la même protection le 13 mars 2021.
Si vous connaissez un ami ou un collègue qui utilise ce plugin sur son site, nous vous recommandons vivement de lui transmettre cet avis pour aider à garder ses sites protégés car il s’agit de vulnérabilités graves qui peuvent conduire à une prise de contrôle complète du site.
Un merci spécial à Lior Regev de Redirection for Contact Form 7 pour une réponse exceptionnellement rapide dans la correction des vulnérabilités révélées.
Source link