
CVE-2026-53767 + CVE-2026-53768 - RCE autenticata in Chyrp Lite ≤ 2026.01 tramite bypass della blocklist di uploads_path e mancata validazione delle estensioni
CVE-2026-53767 + CVE-2026-53768 - RCE autenticata in Chyrp Lite ≤ 2026.01 ("Iriomote")
Attacco concatenato: bypass della blocklist di
uploads_path(CVE-2026-53768) + mancata validazione dell'estensione del file inadmin_update_upload()(CVE-2026-53767) → Remote Code Execution comewww-data
Chyrp Lite ≤ 2026.01 è vulnerabile a una catena di Remote Code Execution autenticata, sfruttabile da qualsiasi utente in possesso delle autorizzazioni change_settings ed edit_upload (predefinito: Administrator).
| CVE | CVE-2026-53767 · CVE-2026-53768 |
| CVSS | 9.1 Critico (AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H) |
| Interessato | xenocrat/chyrp-lite ≤ 2026.01 |
| Corretto | commit 1489dc9 |
| Avvisi di sicurezza | GHSA-8h86-c24h-5jp3 · GHSA-r9w7-5h94-wq5x |
| Segnalatore | iltosec |
python chyrp_rce_poc.py -h
usage: chyrp_rce_poc.py [-h] -u URL -U USERNAME -P PASSWORD [-c CMD] [-i]
[--config CONFIG] [--restore RESTORE]
python chyrp_rce_poc.py -u http://127.0.0.1/chyrp -U admin -P 'fJ945@5:3s8v+X:'
python chyrp_rce_poc.py -u http://127.0.0.1/chyrp -U admin -P 'fJ945@5:3s8v+X:' -c 'cat /etc/passwd'
python chyrp_rce_poc.py -u http://127.0.0.1/chyrp -U admin -P 'fJ945@5:3s8v+X:' -i
Passaggio 1 - Autenticazione
Passaggio 2 - Reindirizza uploads_path a tools/ (non nella blocklist)
immagine
immagine
Passaggio 3 - Sovrascrivi tools/docgen.php (nessun controllo dell'estensione sul file sostitutivo)
immagine
immagine
Passaggio 4 - Esecuzione
http://127.0.0.1/chyrp/tools/docgen.php?cmd=id
immagine
uploads_path incompletaincludes/controller/Admin.php valida uploads_path rispetto a una blocklist hardcoded:
admin | ajax | feathers | fonts | includes | modules | themes
La directory tools/ - inclusa in Chyrp Lite e contenente file .php eseguibili (docgen.php, gettext.php, triggers.php) - non è elencata. L'invio di uploads_path=tools supera la validazione e viene persistito in config.json.php.
admin_update_upload()upload_tester() (includes/helpers.php) controlla solo il codice di errore di upload PHP e la dimensione del file - non esegue alcuna validazione dell'estensione sul file sostitutivo. Il nome del file di destinazione viene preso da $_POST['file'] e risolto rispetto all'uploads_path corrente. Poiché tools/docgen.php esiste già (soddisfacendo il controllo is_file()), viene sovrascritto silenziosamente con contenuto arbitrario.
Nota: Il flag
--configpunta aconfig.json.phpper il calcolo del token CSRF. Se il file non è leggibile localmente, lo script ripiega automaticamente sull'estrazione del token dalla risposta HTML.
Aggiorna a una versione contenente il commit 1489dc9 o successivo.
Sono state applicate due correzioni indipendenti:
Correzione 1 - Aggiungi tools (e licenses) alla blocklist di uploads_path:
// Before
"/^$qdir((admin|ajax|feathers|fonts|includes|modules|themes)$qdir|$)/"
// After
"/^$qdir((admin|ajax|feathers|fonts|includes|licenses|modules|themes|tools)$qdir|$)/"
Correzione 2 - Valida l'estensione del file caricato rispetto alla whitelist in admin_update_upload():
$new_extension = strtolower(pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION));
$whitelist = upload_filter_whitelist();
if (!in_array($new_extension, $whitelist))
error(__("Error"), __("File type is not allowed."), code: 422);
Questo PoC è rilasciato esclusivamente a scopo educativo e di ricerca. Utilizzalo solo contro sistemi di tua proprietà o per i quali disponi di esplicita autorizzazione scritta al test. L'autore non è responsabile per qualsiasi uso improprio.