Le 30 juillet 2021, l’équipe Wordfence Threat Intelligence a lancé le processus de divulgation responsable d’une vulnérabilité que nous avons découverte dans Booster pour WooCommerce, un plugin WordPress installé sur plus de 80 000 sites. Cette faille permettait à un attaquant de se connecter sous le nom de n’importe quel utilisateur, à condition que certaines options soient activées dans le plugin.

Les utilisateurs de Wordfence Premium ont reçu une règle de pare-feu pour se protéger contre tout exploit ciblant cette vulnérabilité le 30 juillet 2021. Les sites utilisant encore la version gratuite de Wordfence recevront la même protection le 29 août 2021.

Nous avons initialement contacté le fournisseur du plugin le 30 juillet 2021. Après avoir reçu la confirmation d’un canal de communication approprié quelques jours plus tard, le 2 août 2021, nous avons fourni tous les détails de la divulgation. Le fournisseur a rapidement reconnu le rapport et un correctif a été publié le 11 août 2021 dans la version 5.4.4.

Nous vous recommandons fortement de mettre à jour immédiatement vers la dernière version corrigée de Booster pour WooCommerce, qui est la version 5.4.4 au moment de la publication.


Booster for WooCommerce est un module complémentaire pour WooCommerce conçu pour améliorer ses fonctionnalités grâce à l’utilisation de divers modules que les propriétaires de sites peuvent activer et désactiver à tout moment. L’un des modules proposés par le plugin est un module « Vérification des e-mails », qui ajoute une exigence pour les utilisateurs de vérifier leur e-mail après s’être inscrits sur le site.

Malheureusement, nous avons constaté que cette fonctionnalité n’était pas implémentée de manière non sécurisée, ce qui permettait à un attaquant d’usurper l’identité de n’importe quel utilisateur et d’envoyer une demande de vérification qui pourrait permettre à l’attaquant de recréer facilement le jeton nécessaire pour « vérifier » l’e-mail de l’utilisateur ciblé, et être automatiquement connecté en tant que cet utilisateur.

Un regard plus attentif sur l’exploit

Afin d’exploiter cette vulnérabilité, un attaquant devrait exécuter deux actions. La première action qu’un attaquant devrait effectuer consiste à envoyer une requête à l’URL d’accueil du site vulnérable avec le wcj_user_id paramètre défini sur l’ID utilisateur que l’attaquant souhaite usurper l’identité. Cela serait probablement défini sur un ID d’utilisateur de 1 car le premier compte d’utilisateur généralement créé sur les sites WordPress est le compte d’utilisateur administratif et cela est rarement modifié.

		} elseif ( isset( $_GET['wcj_user_id'] ) ) {
			$this->reset_and_mail_activation_link( $_GET['wcj_user_id'] );
			wc_add_notice( do_shortcode( wcj_get_option( 'wcj_emails_verification_email_resend_message',
				__( '<strong>Success:</strong> Your activation email has been resent. Please check your email.', 'woocommerce-jetpack' ) ) ) );
		}

Une fois la demande envoyée, le reset_and_mail_activation_link() fonction a été déclenchée. Cela a récupéré le fourni user_id et généré un code pour l’utilisateur qui a été utilisé pour vérifier l’adresse e-mail. La fonction a ensuite déclenché un e-mail à envoyer à l’utilisateur avec le lien de vérification généré qui pourrait être utilisé pour vérifier l’adresse e-mail.

Le cœur de la faille réside ici où le code de vérification était simplement un hachage MD5 du moment de la requête. Cela a permis à un attaquant de recréer facilement un code de vérification valide sans accéder au compte de messagerie de l’utilisateur ciblé en fonction de l’heure à laquelle il a envoyé une demande de vérification pour un utilisateur donné.

	function reset_and_mail_activation_link( $user_id ) {
		$user_info     = get_userdata( $user_id );
		$code          = md5( time() );
		$url           = add_query_arg( 'wcj_verify_email', base64_encode( json_encode( array( 'id' => $user_id, 'code' => $code ) ) ), wc_get_page_permalink( 'myaccount' ) );
		$email_content = do_shortcode( apply_filters( 'booster_option',
			__( 'Please click the following link to verify your email:<br><br><a href="%verification_url%">%verification_url%</a>', 'woocommerce-jetpack' ),
			get_option( 'wcj_emails_verification_email_content',
				__( 'Please click the following link to verify your email:<br><br><a href="%verification_url%">%verification_url%</a>', 'woocommerce-jetpack' ) ) ) );
		$email_content = str_replace( '%verification_url%', $url, $email_content );
		$email_subject = do_shortcode( apply_filters( 'booster_option',
			__( 'Please activate your account', 'woocommerce-jetpack' ),
			get_option( 'wcj_emails_verification_email_subject',
				__( 'Please activate your account', 'woocommerce-jetpack' ) ) ) );
		update_user_meta( $user_id, 'wcj_is_activated', '0' );
		update_user_meta( $user_id, 'wcj_activation_code', $code );

Une fois que l’attaquant avait envoyé une demande de vérification par e-mail pour son utilisateur cible, il devait alors effectuer la deuxième action qui impliquait de créer l’URL pour « vérifier » l’e-mail. Il s’agirait de l’URL d’accueil du site avec le wcj_verify_email paramètre défini sur une charge utile encodée JSON en base64 où le corps encodé en JSON contient l’ID utilisateur cible défini au niveau `id` valeur et le `code` valeur définie comme le hachage MD5 généré au moment où la demande de vérification de l’e-mail a été effectuée.

Si la wcj_emails_verification_redirect_on_success l’option a été définie sur oui et les données envoyées dans le wcj_verify_email paramètre était valide, alors le wp_set_current_user et wp_set_auth_cookie fonctions s’exécuteraient et généreraient une session authentifiée en tant qu’utilisateur ciblé, permettant ainsi à l’attaquant de contourner toute authentification et d’accéder à n’importe quel compte de son choix.

		} elseif ( isset( $_GET['wcj_verify_email'] ) ) {
			$data = json_decode( base64_decode( $_GET['wcj_verify_email'] ), true );
			if ( ! empty( $data['id'] ) && ! empty( $data['code'] ) && get_user_meta( $data['id'], 'wcj_activation_code', true ) == $data['code'] ) {
				update_user_meta( $data['id'], 'wcj_is_activated', '1' );
				if ( 'yes' === wcj_get_option( 'wcj_emails_verification_redirect_on_success', 'yes' ) ) {
					wp_set_current_user( $data['id'] );
					wp_set_auth_cookie( $data['id'] );
				}
				$url = ( '' != ( $custom_url = wcj_get_option( 'wcj_emails_verification_redirect_on_success_custom_url', '' ) ) ? $custom_url : wc_get_page_permalink( 'myaccount' ) );
				wp_safe_redirect( add_query_arg( 'wcj_verified_email', $_GET['wcj_verify_email'], $url ) );
				exit;

En tant que tel, un attaquant pourrait exploiter cette vulnérabilité pour obtenir un accès administratif sur des sites exécutant une version vulnérable du plugin et s’emparer efficacement du site.

Cette vulnérabilité nécessite que le module ‘Email Verification’ soit activé et que le paramètre ‘Login User After Successful Verification’ soit activé, qui par défaut, doit être exploité avec succès sur les sites exécutant le plugin.

Calendrier de divulgation

30 juillet 2021 – Conclusion de l’analyse du plugin qui a conduit à la découverte d’une vulnérabilité de contournement d’authentification dans le plugin WordPress Booster for WooCommerce. Nous développons une règle de pare-feu pour protéger les clients de Wordfence et la diffusons aux utilisateurs de Wordfence Premium. Nous prenons contact avec le fournisseur du plugin.
2 août 2021 – Le vendeur confirme la boîte de réception pour le traitement de la divulgation. Nous envoyons tous les détails de divulgation.
4 août 2021 – Le fournisseur confirme qu’il a reçu les détails et commencera à travailler sur un correctif.
11 août 2021 – Une version récemment mise à jour du plugin est publiée contenant suffisamment de correctifs.
29 août 2021 – Les utilisateurs gratuits de Wordfence reçoivent une règle de pare-feu.

Conclusion

Dans l’article d’aujourd’hui, nous avons détaillé une faille dans Booster for WooCommerce qui permettait aux attaquants de contourner l’authentification et de se connecter en tant qu’utilisateur de site existant, y compris les utilisateurs administratifs, qui pourraient être utilisés pour prendre le contrôle d’un site WordPress vulnérable. Cette faille a été entièrement corrigée dans la version 5.4.4. Nous recommandons aux utilisateurs de WordPress de mettre immédiatement à jour la dernière version disponible, qui est la version 5.4.4 au moment de cette publication.

Wordfence Premium les utilisateurs ont reçu une règle de pare-feu pour se protéger contre tout exploit ciblant cette vulnérabilité le 30 juillet 2021. Les sites utilisant encore la version gratuite de Wordfence recevront la même protection le 29 août 2021.

Si vous connaissez un ami ou un collègue qui utilise ce plugin sur son site, nous vous recommandons fortement de lui transmettre cet avis pour aider à protéger ses sites car il s’agit d’une vulnérabilité critique qui peut conduire à une prise de contrôle complète du site.

Cliquez ici pour rejoindre la liste de diffusion WordPress Security et recevez des rapports de vulnérabilité comme celui-ci dès leur publication.


Source link