
CVE-2026-53767 + CVE-2026-53768 - RCE autenticado en Chyrp Lite ≤ 2026.01 mediante bypass de la lista de bloqueo de uploads_path y falta de validación de extensiones
CVE-2026-53767 + CVE-2026-53768 - RCE autenticado en Chyrp Lite ≤ 2026.01 ("Iriomote")
Ataque encadenado: bypass de la lista negra de
uploads_path(CVE-2026-53768) + falta de validación de la extensión de archivo enadmin_update_upload()(CVE-2026-53767) → Ejecución remota de código comowww-data
Chyrp Lite ≤ 2026.01 es vulnerable a una cadena de ejecución remota de código autenticada, explotable por cualquier usuario que tenga los permisos change_settings y edit_upload (por defecto: Administrador).
| CVE | CVE-2026-53767 · CVE-2026-53768 |
| CVSS | 9.1 Crítico (AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H) |
| Afectado | xenocrat/chyrp-lite ≤ 2026.01 |
| Parcheado | commit 1489dc9 |
| Avisos | GHSA-8h86-c24h-5jp3 · GHSA-r9w7-5h94-wq5x |
| Reportero | 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

Paso 1 - Autenticarse
Paso 2 - Redirigir uploads_path a tools/ (no está en la lista negra)
imagen
imagen
Paso 3 - Sobrescribir tools/docgen.php (sin comprobación de extensión en el reemplazo)
imagen
imagen
Paso 4 - Ejecutar
http://127.0.0.1/chyrp/tools/docgen.php?cmd=id
imagen
uploads_pathincludes/controller/Admin.php valida uploads_path contra una lista negra fija:
admin | ajax | feathers | fonts | includes | modules | themes
El directorio tools/, que se incluye con Chyrp Lite y contiene archivos .php ejecutables (docgen.php, gettext.php, triggers.php), no está en la lista. Al enviar uploads_path=tools se supera la validación y se persiste en config.json.php.
admin_update_upload()upload_tester() (includes/helpers.php) solo comprueba el código de error de subida de PHP y el tamaño del archivo; no realiza ninguna validación de extensión sobre el archivo de reemplazo. El nombre del archivo destino se toma de $_POST['file'] y se resuelve contra el uploads_path actual. Dado que tools/docgen.php ya existe (satisfaciendo la comprobación is_file()), se sobrescribe silenciosamente con contenido arbitrario.
Nota: La opción
--configapunta aconfig.json.phppara el cálculo del token CSRF. Si el archivo no es legible localmente, el script recurre automáticamente a extraer el token de la respuesta HTML.
Actualiza a una versión que contenga el commit 1489dc9 o posterior.
Se aplicaron dos correcciones independientes:
Corrección 1 - Añadir tools (y licenses) a la lista negra de uploads_path:
// Antes
"/^$qdir((admin|ajax|feathers|fonts|includes|modules|themes)$qdir|$)/"
// Después
"/^$qdir((admin|ajax|feathers|fonts|includes|licenses|modules|themes|tools)$qdir|$)/"
Corrección 2 - Validar la extensión del archivo subido contra la lista blanca en 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);
Este PoC se publica únicamente con fines educativos y de investigación. Úsalo solo contra sistemas de tu propiedad o para los que tengas permiso explícito por escrito para probar. El autor no se hace responsable de cualquier uso indebido.