CVE-2024-13728: Reflected XSS no Plugin WordPress Accept Donations with PayPal & Stripe

A imagem mostra um alerta de segurança em fundo preto com texto em verde, no estilo de terminal de computador. No topo aparece "CVE-2024-13728" seguido de "Reflected XSS". No centro há o logotipo de um plugin chamado "Accept Donations PayPal & stripe". Abaixo há um box verde com informações sobre a vulnerabilidade: "Vulnerabilidade em Versões

Introdução

As vulnerabilidades de Cross-Site Scripting (XSS) continuam sendo uma das falhas de segurança mais comuns em aplicações web. Recentemente, identifiquei uma vulnerabilidade de XSS Refletido no plugin de WordPress “Accept Donations with PayPal & Stripe”, que afeta todas as versões até 1.4.4.

Informações relevantes:

  • Plugin: Accept Donations with PayPal & Stripe
  • Versões afetadas: <= 1.4.4
  • CVE: CVE-2024-13728
  • CWE: CWE-79 (Improper Neutralization of Input During Web Page Generation)
  • CVSS: 6.1 (Médio) – CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
  • Data de publicação: 22 de fevereiro de 2025 (Wordfence Intelligence)

O Plugin e a Vulnerabilidade

Accept Donations with PayPal & Stripe

Accept Donations with PayPal & Stripe é um plugin para WordPress que permite aos proprietários de sites aceitar doações facilmente através do PayPal e do Stripe. Ele é usado por organizações sem fins lucrativos, blogs pessoais e diversos outros tipos de sites que desejam receber contribuições financeiras.

A Vulnerabilidade

A vulnerabilidade encontrada permite que um atacante, sem necessidade de autenticação, execute ataques de Cross-Site Scripting (XSS) Refletido através do parâmetro rf no endpoint de redirecionamento de checkout do Stripe. Devido à falta de sanitização adequada desse parâmetro, é possível injetar código JavaScript malicioso que será executado no navegador da vítima quando acessar URLs especialmente elaboradas.

Análise Técnica

A vulnerabilidade está localizada na função checkout_redirect na classe Stripe (core/Base/Stripe.php). Esta função é responsável por redirecionar para a página do Stripe para realizar o pagamento.

/**
 * Open Stripe checkout in new tab
 */
public function checkout_redirect() {
	if ( !empty( $_GET['wpedon-stripe-checkout-redirect'] ) &&
		!empty( $_GET['sk'] ) &&
		!empty( $_GET['ai'] ) &&
		!empty( $_GET['si'] ) &&
		!empty( $_GET['rf'] )
	) {
		?>
		<script src="https://js.stripe.com/v3/"></script>
		<script>
	try {
		const stripe = Stripe('<?php echo sanitize_text_field($_GET['sk']); ?>', {
		stripeAccount: '<?php echo sanitize_text_field($_GET['ai']); ?>'
		});
		stripe.redirectToCheckout({
		sessionId: '<?php echo sanitize_text_field($_GET['si']); ?>'
		});
	} catch (error) {
		let rf = '<?php echo sanitize_text_field($_GET['rf']); ?>';
		rf += rf.indexOf('?') !== -1 ? '&' : '?';
		rf += 'wpedon_stripe_success=0';
		window.location.href = rf;
	}
		</script>
		<?php
		die();
	}
}

O problema está no tratamento do parâmetro rf. Embora a função sanitize_text_field() seja aplicada, esta função apenas remove tags HTML indesejadas e não impede esquemas de URL maliciosos como javascript:. Quando o código é executado, se ocorrer um erro na inicialização do Stripe (o que pode ser forçado fornecendo parâmetros inválidos), o valor do parâmetro rf é atribuído diretamente à propriedade window.location.href.

Isso permite que um atacante use o esquema javascript: para executar código arbitrário, utilizando a seguinte técnica:

  1. O atacante fornece um valor malicioso para o parâmetro rf, como javascript:alert(document.cookie);// e o resto dos parâmetros de forma que cause erro (atribui o valor 1 para todos os outros parâmetros, fazendo também com que entre no primeiro if da função e execute o código)
  2. O WordPress aplica sanitize_text_field(), que não filtra o esquema javascript:
  3. Quando ocorre um erro no processamento do Stripe, o código atribui o valor malicioso à propriedade window.location.href
  4. O navegador da vítima interpreta o esquema javascript: como uma instrução para executar o código JavaScript especificado

Prova de Conceito (POC)

Durante meus testes no plugin, consegui demonstrar a vulnerabilidade com o seguinte URL:

http://exemplo.com/?wpedon-stripe-checkout-redirect=1&sk=1&ai=1&si=1&rf=javascript:alert(document.cookie);//

Ao acessar este URL em um navegador:

  1. A função checkout_redirect processa a solicitação porque todos os parâmetros necessários estão presentes
  2. A tentativa de inicialização do Stripe falha porque os parâmetros são inválidos
  3. O código de tratamento de erro é executado, atribuindo o valor malicioso de rf à propriedade window.location.href
  4. O código JavaScript alert(document.cookie) é executado no contexto do navegador da vítima

Além disso, a vulnerabilidade de Open Redirect também pode ser explorada para redirecionar usuários para sites de phishing, já que não há validação do domínio de destino no parâmetro rf.

Impacto e Riscos

Esta vulnerabilidade de Reflected XSS pode ter vários impactos negativos:

  1. Roubo de cookies de sessão e sequestro de contas de usuários (session hijacking)
  2. Redirecionamento para sites maliciosos
  3. Exibição de conteúdo fraudulento para os usuários
  4. Modificação do conteúdo da página para realizar ataques de phishing
  5. Execução de ações não autorizadas no contexto do usuário logado

O impacto é amplificado pelo fato de que a vulnerabilidade não requer autenticação para ser explorada e pode ser facilmente incorporada em links maliciosos enviados por e-mail, mensagens ou redes sociais.

Como Foi Corrigido

Na versão 1.4.5, os desenvolvedores alteraram a função de sanitização para esc_url, sendo assim uma validação adequada para o parâmetro rf, garantindo que apenas URLs legítimas possam ser usadas como destinos de redirecionamento.

Conclusão

O CVE-2024-13728 demonstra a importância de implementar uma validação e sanitização adequada de entradas de usuário, especialmente em parâmetros de URL que são usados em contextos sensíveis como atribuições a window.location. A vulnerabilidade foi corrigida na versão 1.4.5 do Accept Donations with PayPal & Stripe, e todos os usuários são fortemente recomendados a atualizar para esta versão ou posterior.

Agradeço à equipe do Wordfence Intelligence pelo profissionalismo durante o processo de divulgação e aos desenvolvedores do plugin pela implementação rápida de uma correção eficaz.


Este post foi escrito com base em minha descoberta do CVE-2024-13728, documentado no banco de dados de vulnerabilidades do Wordfence Intelligence. Se você tiver dúvidas ou comentários, deixe-os abaixo ou entre em contato diretamente.

Posts relacionados

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *