À la fin du mois dernier, un patch a été publié pour Coupons intelligents WooCommerce, un plugin commercial WooCommerce qui aide les responsables de magasin à gérer les coupons et les chèques-cadeaux Dans les versions vulnérables du plug-in, les attaquants non authentifiés pouvaient s’envoyer des chèques-cadeaux de toute valeur, qui pouvaient être échangés contre des produits vendus sur la vitrine de la victime.

Cette vulnérabilité a été initialement identifiée par Aaron Averbuch et son équipe de Bloomscape, qui nous a contactés en privé après avoir signalé le problème aux développeurs du plugin. Un patch a été publié le lendemain dans la version 4.6.5 de WooCommerce Smart Coupons. Pour protéger nos utilisateurs, nous avons publié une règle de pare-feu pour bloquer les tentatives d’exploitation de cette faille. Wordfence Premium les utilisateurs ont déjà accès à cette règle, et les sites encore sur la version gratuite recevront la règle le 25 mars 2020, trente jours après sa sortie.

Nous invitons tous les utilisateurs de WooCommerce Smart Coupons à mettre à jour vers la dernière version disponible dès que possible afin d’atténuer le risque de certificats-cadeaux frauduleux. Les utilisateurs typiques de WordPress mettent à jour les plugins commerciaux de manière moins fiable que ceux du référentiel WordPress, et cette tendance se poursuit avec ce plugin. Au moment d’écrire ces lignes, près de neuf sites sur dix utilisant WooCommerce Smart Coupons exécutent toujours une version vulnérable du plugin.

Dans l’article d’aujourd’hui, nous examinons la vulnérabilité et discutons de la façon d’identifier si votre site a été affecté.

Vulnérabilité en détail

L’une des fonctionnalités des WooCommerce Smart Coupons permet aux directeurs de magasin de créer des certificats-cadeaux qui peuvent être envoyés par e-mail aux clients. L’interface de cette fonctionnalité est uniquement disponible pour les rôles d’utilisateur avec le manage_woocommerce , qui est disponible par défaut sur le administrator et shop_manager rôles.

Capture d'écran de l'interface Send Store Credit

Capture d’écran de l’interface Send Store Credit.

Cette fonctionnalité a été rendue vulnérable par la façon dont WooCommerce Smart Coupons a traité les entrées de ce formulaire. Alors que la page du tableau de bord pour cette fonctionnalité était réservée aux utilisateurs privilégiés, le plugin écoutait les soumissions sur chaque page de wp-admin.

add_action( 'admin_init', array( $this, 'woocommerce_coupon_admin_init' ) );
public function woocommerce_coupon_admin_init() {

	$get_import = ( isset( $_GET['import'] ) ) ? wc_clean( wp_unslash( $_GET['import'] ) ) : ''; // phpcs:ignore
	$get_page   = ( isset( $_GET['page'] ) ) ? wc_clean( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore
	$get_action = ( isset( $_GET['action'] ) ) ? wc_clean( wp_unslash( $_GET['action'] ) ) : ''; // phpcs:ignore

	$post_smart_coupon_email   = ( isset( $_POST['smart_coupon_email'] ) ) ? wc_clean( wp_unslash( $_POST['smart_coupon_email'] ) ) : ''; // phpcs:ignore
	$post_smart_coupon_amount  = ( isset( $_POST['smart_coupon_amount'] ) ) ? wc_clean( wp_unslash( $_POST['smart_coupon_amount'] ) ) : 0; // phpcs:ignore
	$post_smart_coupon_message = ( isset( $_POST['smart_coupon_message'] ) ) ? wp_kses_post( wp_unslash( $_POST['smart_coupon_message'] ) ) : ''; // phpcs:ignore

	if ( 'wc-sc-coupons' === $get_import || 'wc-smart-coupons' === $get_page ) {
		ob_start();
	}

	if ( defined( 'WP_LOAD_IMPORTERS' ) ) {
		register_importer( 'wc-sc-coupons', __( 'WooCommerce Coupons (CSV)', 'woocommerce-smart-coupons' ), __( 'Import coupons to your store via a csv file.', 'woocommerce-smart-coupons' ), array( $this, 'coupon_importer' ) );
	}

	if ( 'sent_gift_certificate' === $get_action && 'wc-smart-coupons' === $get_page ) {
		$email   = $post_smart_coupon_email;
		$amount  = $post_smart_coupon_amount;
		$message = $post_smart_coupon_message;
		$this->send_gift_certificate( $email, $amount, $message );
	}
}

Les extraits ci-dessus, extraits de class-wc-sc-admin-pages.php, montrez comment cette entrée est gérée. Le plugin enregistre le woocommerce_coupon_admin_init() fonction à WordPress admin_init crochet. Cette fonction effectue des vérifications pour déterminer s’il faut démarrer la mise en mémoire tampon de sortie ou enregistrer un importateur CSV, mais vérifie ensuite s’il doit envoyer un certificat-cadeau.

Il prend cette décision sur la base de deux $_GET paramètres: action=sent_gift_certificate et page=wc-smart-coupons. Ces paramètres sont courants dans le tableau de bord WordPress, mais y accéder directement n’est pas sûr dans ce cas. Il n’y a aucune validation qu’un utilisateur a accès à la wc-smart-coupons page.

Comme nous l’avons signalé dans plusieurs cas récemment, tels que les vulnérabilités des e-mails et des newsletters et la campagne Zero Day de la semaine dernière, les admin_init hook est accessible à tous les visiteurs d’un site. Les utilisateurs non authentifiés peuvent envoyer des demandes à /wp-admin/admin-post.php, qui répondra aux exigences de is_admin() ainsi que le déclenchement de chaque fonction accrochée à admin_init. Ceci, bien sûr, comprend woocommerce_coupon_admin_init().

En créant une demande avec tous les paramètres nécessaires, les attaquants pourraient générer et envoyer eux-mêmes des certificats-cadeaux valides pour la boutique WooCommerce d’une victime. Cette vulnérabilité a été corrigée à partir de WooCommerce Smart Coupons 4.6.5.

L’assainissement peut être délicat

En interne, ces certificats-cadeaux sont considérés comme des coupons, tout comme un coupon-rabais typique que vous distribueriez pour une promotion. Ils se comportent différemment, avec une valeur qui peut être dépensée au lieu d’une remise réutilisable, mais sont traités de la même manière dans l’interface WooCommerce.

Capture d'écran d'une liste de coupons générés.

Capture d’écran d’une liste de coupons générés.

Malheureusement, cela signifie qu’il n’est pas possible pour les WooCommerce Smart Coupons d’invalider tout crédit de magasin frauduleux créé par le biais de cette vulnérabilité. Si un site vulnérable était exploité et que le crédit de magasin était généré, il serait toujours valide et utilisable après la mise à jour du plugin par le propriétaire du site. Chaque coupon devra être supprimé par un administrateur ou un directeur de magasin pour empêcher leur utilisation.

Pour les magasins qui n’utilisent pas ces certificats-cadeaux, la correction est aussi simple que de supprimer chaque coupon avec le type Store Credit / Gift Certificate. Cependant, pour les sites qui envoient fréquemment du crédit en magasin, il peut ne pas être immédiatement clair quels coupons sont légitimes et lesquels ont été créés frauduleusement.

Si vous pensez que le crédit en magasin a été créé par un utilisateur malveillant, vous pouvez identifier les coupons frauduleux de deux manières.

Comparaison des temps de création de coupons avec les journaux d’accès

Cette méthode nécessite l’accès aux journaux d’accès de votre site. Si vous ne savez pas comment y accéder, contactez votre hébergeur pour obtenir de l’aide.

Bien que cette vulnérabilité permette de générer des coupons sur des sites non authentifiés /wp-admin points de terminaison, l’utilisation légitime envoie uniquement les demandes à un seul emplacement: /wp-admin/admin.php. Ce point de terminaison est inaccessible aux utilisateurs non authentifiés, donc tous les coupons générés par une demande à ce fichier sont légitimes.

D’autre part, les coupons générés par des demandes à d’autres endroits, comme /wp-admin/admin-post.php ou /wp-admin/admin-ajax.php, sont probablement frauduleux.

Par exemple, la chaîne suivante dans un journal d’accès suggère une tentative d’exploitation de cette vulnérabilité:

"POST /wp-admin/admin-post.php?page=wc-smart-coupons&action=sent_gift_certificate HTTP/1.1"

Le suivant est une entrée légitime:

"POST /wp-admin/admin.php?page=wc-smart-coupons&action=sent_gift_certificate HTTP/1.1"

En comparant les horodatages de ces entrées de journal aux heures de publication des coupons suspects, vous pouvez déterminer ceux à conserver et ceux à supprimer.

Vérification des e-mails suspects dans les métadonnées de publication WordPress

Cette méthode nécessite l’accès à la base de données de votre site. Si vous ne savez pas comment y accéder, contactez votre hébergeur pour obtenir de l’aide.

Bien que l’interface WooCommerce Smart Coupons ne révèle pas immédiatement où chaque coupon a été envoyé, ces données sont toujours stockées dans la base de données WordPress.

Recherchez sur votre site wp_postmeta table pour suspect customer_email entrées avec une requête comme la suivante. (Remarque: le préfixe de la base de données de votre site peut être différent, mais nous utiliserons la valeur par défaut wp_ dans nos exemples.)

mysql> select * from wp_postmeta where meta_key = 'customer_email';
+---------+---------+----------------+--------------------------------------------+
| meta_id | post_id | meta_key       | meta_value                                 |
+---------+---------+----------------+--------------------------------------------+
|     168 |      54 | customer_email | a:1:{i:0;s:24:"shopshopshop@example.com";} |
|     188 |      55 | customer_email | a:1:{i:0;s:23:"hacker@evil.example.com";}  |
|     266 |      57 | customer_email | a:1:{i:0;s:22:"shopperman@example.com";}   |
|     285 |      59 | customer_email | a:1:{i:0;s:21:"luvs2shop@example.com";}    |
+---------+---------+----------------+--------------------------------------------+
4 rows in set (0.00 sec)

Dans l’exemple ci-dessus, nous voyons quatre coupons avec différents customer_email valeurs. Un e-mail particulier se démarque: hacker@evil.example.com. le post_id pour ce coupon est 55, voyons donc quel code de coupon correspond à:

mysql> select post_title from wp_posts where ID = 55;
+---------------+
| post_title    |
+---------------+
| qvi93te4veedu |
+---------------+
1 row in set (0.00 sec)

Maintenant, nous voyons le code de coupon incriminé: qvi93te4veedu. Avec cela, nous pouvons supprimer le coupon ou enquêter plus avant pour identifier les commandes sur lesquelles le crédit en magasin a pu être utilisé.

Tous les utilisateurs malveillants ne disposent pas d’adresses e-mail facilement identifiables, mais vous pouvez également comparer ces e-mails à d’autres ressources telles que votre liste de diffusion et les commandes précédentes pour identifier les valeurs aberrantes suspectes.

Chronologie

  • 20 février 2020 – Vulnérabilité révélée par Aaron Averbuch et son équipe de Bloomscape.
  • 21 février 2020 – La version 4.6.5 de WooCommerce Smart Coupons a été publiée pour corriger la vulnérabilité.
  • 24 février 2020 – Règle de pare-feu publiée pour empêcher l’exploitation contre les sites avec Wordfence Premium.
  • 25 mars 2020 – Règle de pare-feu disponible pour les utilisateurs gratuits de Wordfence.

Conclusion

Des vulnérabilités telles que celle-ci, où les fonctionnalités sont destinées à des utilisateurs privilégiés mais sont laissées ouvertes par inadvertance aux attaques, sont malheureusement courantes. Si vous développez des plugins et des thèmes WordPress, assurez-vous de valider les capacités des utilisateurs directement pour toute activité privilégiée. Accrocher le code dans admin_initou tenter de sécuriser des fonctionnalités avec is_admin() vérifications, est dangereux et inefficace sans effectuer ces vérifications de capacités. Pour plus d’informations sur la vérification des capacités des utilisateurs, visitez le Entrée de codex WordPress.org pour current_user_can().

Pour le moment, nous n’avons détecté aucune activité malveillante ciblant les coupons intelligents WooCommerce. Cela dit, il est très important de mettre à jour la dernière version du plugin dès que possible.

Wordfence Premium les utilisateurs sont déjà protégés contre d’éventuelles attaques. Les sites de la version gratuite recevront la règle à la date spécifiée dans le calendrier ci-dessus.

Nous surveillerons notre réseau pour tout changement d’activité autour de cette vulnérabilité et fournirons des détails au fur et à mesure de leur apparition.

Merci encore à Aaron Averbuch et à son équipe de Bloomscape pour leur découverte et divulgation de ce problème. Remerciements supplémentaires au responsable QA Matt Rusnak pour son aide dans l’analyse de vulnérabilité.


Source link