
PoC Python per CVE-2026-92805: la procedura guidata di installazione XHR non autenticata di UVdesk consente la riscrittura di DATABASE_URL e la creazione di ROLE_SUPER_ADMIN tramite le modalità fingerprint e admin.
POC super-admin del wizard non autenticato di UVdesk
UVdesk Community Skeleton fino alla versione 1.1.8 — la XHR del wizard di installazione (ConfigureHelpdesk) non ha autenticazione né controllo dello stato di installazione. Un chiamante non autenticato può riscrivere DATABASE_URL e creare un ROLE_SUPER_ADMIN. Non esiste un tag pubblico con la patch (v1.1.9 restituisce 404).
Solo per test autorizzati. Non eseguire questo strumento contro sistemi di cui non sei proprietario o per cui non hai il permesso di eseguire test.
Requisiti: Python 3, solo libreria standard.
python3 cve-2026-92805-uvdesk-wizard-admin.py -u http://TARGET --test
python3 cve-2026-92805-uvdesk-wizard-admin.py -u http://TARGET --admin --email [email protected] --password 'PwnedAdmin1!'
python3 cve-2026-92805-uvdesk-wizard-admin.py -u https://TARGET --test --insecure
python3 cve-2026-92805-uvdesk-wizard-admin.py -u TARGET --test
| Flag | Cosa fa |
|---|---|
-u / --url | URL di base dell'helpdesk (obbligatorio). http:// o https://. Un hostname senza schema viene provato prima come HTTPS, poi come HTTP. I redirect http→https mantengono il POST. I certificati TLS non validi vengono ritentati senza verifica; --insecure salta la verifica fin dall'inizio |
--test | Solo fingerprinting: POST /wizard/xhr/check-requirements (specification=php-version). Nessuna scrittura di .env, nessun utente |
--admin | Catena completa del wizard: memorizza DB + super-user nella sessione PHP, scrive DATABASE_URL, esegue la migrazione, crea ROLE_SUPER_ADMIN |
--email / --password / --name | Super-admin da creare (valori predefiniti [email protected] / PwnedAdmin1! / Pwned Admin) |
--db-host / --db-port / --db-user / --db-pass / --db-name | MySQL come lo vede l'app PHP (valori predefiniti 127.0.0.1:3306 / uvdesk / uvdesk / uvdesk) |
--create-db | Chiede al wizard di eseguire CREATE DATABASE se lo schema è mancante |
--insecure | Salta la verifica TLS |
--timeout | Timeout HTTP in secondi (predefinito 120; le migrazioni possono essere lente) |
Endpoint di --test: POST /wizard/xhr/check-requirements. Un JSON 200 con "version" / "status" è PRESENT / VULNERABLE. Non tocca mai load/configurations o load/super-user. Dopo un'installazione completata, GET / reindirizza lontano dall'HTML del wizard; le route XHR rispondono comunque. Questo è il bug.
--admin non è autenticato. Il wizard pensa di essere l'installer di primo avvio. --db-* non è un client MySQL sulla tua macchina; vengono inviati all'app in modo che PHP possa connettersi (il caso tipico è 127.0.0.1 sullo stesso host).
Non devi scoprire il nome di uno schema esistente. --db-name è un nome che scegli tu (predefinito uvdesk). --create-db imposta il flag createDatabase del wizard in modo che PHP esegua CREATE DATABASE se quel nome è mancante. Senza --create-db, un nome mancante restituisce NEED_DB ("The requested database was not found"). Creare un nome nuovo richiede un utente MySQL con privilegio CREATE (un uvdesk@localhost bloccato che ha diritti solo su uvdesk.* può riutilizzare uvdesk, ma potrebbe non poter creare uvdesk_pwn). --test non comunica mai con MySQL.
Se su quello schema esiste già un super-admin, load/super-user è un no-op — --create-db più un nuovo --db-name crea uno schema di tua proprietà e punta DATABASE_URL ad esso.
Stdout: UVDESK, WIZARD_PAGE, PHP, STATUS, PRESENT, VULNERABLE, NOT_VULNERABLE, NOT_FOUND, NEED_DB, ADMIN, LOGIN.

CVE: CVE-2026-92805. Prodotto: uvdesk/community-skeleton.