Summary
I found an open redirect (CWE-601) in the Contact Form 7 – PayPal & Stripe Add-on WordPress plugin, affecting all versions before 2.5. It was assigned CVE-2026-14236 and coordinated through WPScan.
The plugin takes a user-supplied return URL and drops it straight into the Stripe
Checkout success_url and cancel_url without checking the host. An
unauthenticated attacker can craft a link that runs a real checkout on the
legitimate store and then bounces the victim to any external site — a
high-credibility phishing primitive, since the whole flow starts on the trusted
domain.
- CVE: CVE-2026-14236
- Type: Open Redirect (CWE-601)
- Affected: Contact Form 7 – PayPal & Stripe Add-on,
< 2.5 - Auth required: None
- Credit: Pedro Antunes (finder), WPScan (coordinator)
- Advisory: https://wpscan.com/vulnerability/b53cc13d-c59e-4c11-aa71-fa1c38c2a34d/
The bug
During the Stripe checkout flow, the plugin reads a cf7pp_return parameter from
the request and uses it to build both the success and cancel redirect targets
that Stripe sends the user to after checkout.
The only validation applied is:
filter_var($url, FILTER_VALIDATE_URL)
That check only confirms the string is a syntactically valid URL — any absolute
external URL passes it. There is no same-origin or host allow-list, so
https://attacker.example/... is accepted just as happily as a path on the
store’s own domain.
The tainted value flows into:
success_url = https://attacker.example/fake-error?cf7pp_stripe_success=1&cf7pp_fid=4&id={CHECKOUT_SESSION_ID}
cancel_url = https://attacker.example/fake-error
Proof of concept
Prerequisites: a Contact Form 7 form with a Stripe price set and Stripe configured — i.e. the plugin’s normal payment state. No non-default option is required.
An unauthenticated attacker crafts a link to the store using their own URL as the return parameter:
https://victim.example/?cf7pp_stripe_redirect=4&cf7pp_fid=4&cf7pp_return=https://attacker.example/fake-error&cf7pp_p=55
The victim engages a real Stripe Checkout on the legitimate store domain, and
on completion (success_url) or cancel (cancel_url) is redirected to the
attacker’s site.
Because the transaction genuinely happens on the trusted store, the victim has every reason to trust whatever page they land on afterwards — a fake “payment error, re-enter your card” page on the attacker domain is extremely convincing.
Impact
- Phishing / credential harvesting: land the victim on a look-alike error or login page right after a legitimate payment.
- Trust abuse: the flow begins on the real store domain, so the redirect inherits that credibility.
- Unauthenticated + one click: the whole thing is a single crafted link, no account needed.
Notes on the fix
Confirmed still present in 2.4.10 at the time of research: the redirect code
(includes/redirect_stripe.php, includes/redirect_methods.php) was
byte-identical to 2.4.6. The vendor’s earlier 2.4.8 / 2.4.10 security work only
hardened the separate PayPal IPN handler — the Stripe redirect path was untouched
until 2.5.
Takeaway: FILTER_VALIDATE_URL is not an authorization check. Validating that
something is a URL says nothing about whether it points where you want. Any
user-controlled redirect target needs a host allow-list or a same-origin check.
Timeline
- 2026-06-30 — Reported to WPScan
- 2026-07-03 — Vendor fix released (2.5)
- 2026-07-27 — CVE-2026-14236 published
References
- CVE record — https://www.cve.org/CVERecord?id=CVE-2026-14236
- WPScan advisory — https://wpscan.com/vulnerability/b53cc13d-c59e-4c11-aa71-fa1c38c2a34d/