服务器端模板注入 - ssti 漏洞 - ssti 有效载荷

用实际代码示例解释服务器端模板注入

服务器端模板注入 (SSTI) 是一种漏洞,其中用户输入由模板引擎进行评估,而不是以纯文本形式呈现,从而允许攻击者在服务器上运行任意代码。

服务器端模板注入的幕后工作原理

当用户输入直接嵌入到模板引擎中,且未经适当的过滤或隔离进行评估时,就会发生服务器端模板注入。这会创建一个 SSTI 漏洞,允许攻击者注入特制的 SSTI 有效载荷(例如, {{7*7}} Jinja2 中的 SSTI 负载(在 Jinja2 中)会被引擎评估,从而实现从数据泄露到服务器上下文中任意代码执行的所有攻击。由于不同的模板引擎公开不同的对象和 API,SSTI 负载因平台而异,但具有相同的危险性:它们允许不受信任的输入逃脱预期的渲染流程并在应用程序的运行时执行,如果不加以控制,通常会导致完全远程代码执行或横向移动。

Jinja2 中的最小漏洞示例

如果用户发送 ?名称={{7*7}},应用程序将对其进行评估,返回 您好49。这是教科书式的 SSTI 漏洞。

Twig 中的最小漏洞示例

攻击者可以注入 SSTI 有效载荷,例如 {{7*7}} 来证明代码的执行。 危险:简单的注入可能会升级为读取文件、执行操作系统命令或深入基础设施。

真实世界漏洞:触发远程代码执行的 SSTI 有效负载

一旦存在 SSTI 漏洞,攻击者就会尝试从概念验证数学转向全面 RCE的. 不同的模板引擎对有效载荷的处理方式不同。

Jinja2 有效载荷

  • {{7*7}} → 算术执行
  • {{config.items()}} → 泄露服务器配置。
  • {{ “”.__class__.__mro__[2].__subclasses__() }} → RCE 路径

速度有效载荷

  • #设置($x=”7″)${x} → 注射旁路
  • #设置($a=$class.inspect(“java.lang.Runtime”)) → 直接运行时访问

Twig 有效载荷

  • {{7*7}} → 算术
  • {{app.request.server.all}} → 环境变量
  • {{_self.env.registerUndefinedFilterCallback(‘system’)}} → 代码执行

这些 SSTI 有效载荷展示了不同引擎中的相同漏洞如何导致不同的 利用路径, 但它们总是很危险。

服务器端模板注入的隐藏位置 CI/CD驱动的应用程序

服务器端模板注入不仅仅是 Web 应用程序的风险;它还出现在 现代 CI/CD pipelines 了。 典型的藏身之处包括:

  • 掌舵图 在 Kubernetes 中,模板值是动态呈现的
  • 电子邮件模板 连接用户控制的输入
  • Dashboards 将查询字符串或配置数据注入模板
  • DevOps 脚本 使用模板引擎生成 HTML/Markdown。

计费示例:

If.Values.message 来自不受信任的输入,它会在你的部署中引入服务器端模板注入 pipeline 本身。

使用更安全的模板模式和静态分析预防 SSTI

缓解 SSTI 漏洞需要更好的编码模式和早期检测。

安全模式

  • ❌不要使用 render_template_string 或同等学历
  • ✅ 使用预定义的模板文件并传递已清理的变量
  • ✅ 沙盒模板引擎(如果可用)
  • ✅ 在渲染之前验证并转义用户输入
  •  

开发人员迷你清单

  • 永远不要直接渲染原始用户输入
  • 在支持的情况下使用沙盒模板
  • 清理并验证所有模板变量
  • 避免自定义模板评估器
  • 扫描二维码 render_template_string 或字符串连接模式

静态分析 并且 linters 可以在有风险的构造进入生产之前对其进行标记。

在 DevSecOps 中嵌入 SSTI 检查 Pipelines

尽早发现服务器端模板注入比事后修复更经济、更安全。DevSecOps 团队应该将检查嵌入到 pipelines:

  • Commit hooks: 拒绝 commit具有危险功能的(render_template_string)
  • 静态分析器:扫描模板代码中的服务器端模板注入风险
  • 依赖项验证:标记具有已知 SSTI 漏洞的过时模板引擎
  • Pipeline 盖茨:块合并直到 SSTI 检查通过

通过将 SSTI 有效载荷检测作为 CI/CD,就可以防止可利用的代码被发送。

不要让服务器端模板注入进入你的堆栈

单个服务器端模板注入可能会从数学技巧升级({{7*7}}) 到完全远程代码执行。SSTI 漏洞不仅出现在 Web 应用程序中,还出现在 CI/CD pipelines、Helm 图表和电子邮件模板。

关键外卖

  • 永远不要将原始用户输入呈现到模板中
  • 验证并清理所有动态变量
  • 不同的引擎(Jinja2、Velocity、Twig)有不同的 SSTI 有效载荷,但都可以被武器化
  • 使用静态分析和快速失败门 pipelines
  • 定期审核堆栈中的模板

西吉尼 Xygeni 会在代码库中扫描注入漏洞和其他不安全的编码模式,并在未经清理的模板渲染等风险结构进入生产环境之前将其捕获,其 OWASP 基准测试的误报率最低。 CI/CD 和 IaC security 扫描功能将同样的覆盖范围扩展到 pipeline Xygeni 会检查配置、Helm Chart 和构建脚本,并在发布前标记错误配置和恶意命令。当 Xygeni 发现漏洞时,AI AutoFix 会直接在项目中生成一个上下文相关的、可供开发人员使用的修复程序。 pull request因此,补救措施不会等到下一个迭代周期。

在DevSecOps中,捕获模板注入至关重要。 pipeline 部署阶段,而不是部署之后,才是防止单个有效载荷完全失效的关键。

免费开始。 无需信用卡,几分钟即可扫描您的第一个仓库。

常见问题解答

什么是服务器端模板注入?

当用户输入被传递到模板引擎并作为代码执行而不是作为文本显示时,就会发生 SSTI,这使得攻击者能够在服务器上下文中执行命令。

SSTI 和 XSS 是一回事吗?

不。XSS 注入的脚本会在受害者的浏览器中运行;SSTI 注入的代码会在服务器端由模板引擎执行,因此 SSTI 可以直接导致远程代码执行。

哪些模板引擎容易受到SSTI攻击?

任何对表达式进行求值的引擎,如果用户输入未经清理,都可能存在漏洞,包括 Jinja2、Twig 和 Velocity,尽管它们各自暴露的对象不同,因此攻击路径也不同。

如何预防皮肤软组织感染 CI/CD pipelines?

扫描危险模式,例如 render_template_string at commit 在支持的情况下,使用沙箱模板引擎,并在代码进入生产环境之前,根据静态分析结果进行代码合并。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
注册免费账号。
不需要信用卡。

保护您的软件开发和交付

使用 Xygeni 产品套件