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:
- O atacante fornece um valor malicioso para o parâmetro
rf
, comojavascript:alert(document.cookie);//
e o resto dos parâmetros de forma que cause erro (atribui o valor1
para todos os outros parâmetros, fazendo também com que entre no primeiro if da função e execute o código) - O WordPress aplica
sanitize_text_field()
, que não filtra o esquemajavascript:
- Quando ocorre um erro no processamento do Stripe, o código atribui o valor malicioso à propriedade
window.location.href
- 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:
- A função
checkout_redirect
processa a solicitação porque todos os parâmetros necessários estão presentes - A tentativa de inicialização do Stripe falha porque os parâmetros são inválidos
- O código de tratamento de erro é executado, atribuindo o valor malicioso de
rf
à propriedadewindow.location.href
- 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:
- Roubo de cookies de sessão e sequestro de contas de usuários (session hijacking)
- Redirecionamento para sites maliciosos
- Exibição de conteúdo fraudulento para os usuários
- Modificação do conteúdo da página para realizar ataques de phishing
- 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.