跳转至

Server-side template injection (SSTI)

服务端模板注入 (SSTI)

描述

SSTI,即服务端模板注入 (Server-Side Template Injection),是一种安全漏洞,当攻击者能够将恶意代码注入模板引擎时就会发生。模板引擎通常用于 Web 应用程序中以生成动态内容,当用户输入在包含到模板之前没有经过适当验证或净化时,就会发生 SSTI。

# 假设 user_input 包含用户控制的数据
user_input = params[:input]

# ERB 的不安全使用
template = ERB.new("<%= #{user_input} %>")
result = template.result(binding)

# 输出结果
puts result
// Vulnerable PHP code using Twig
$name = $_GET['name'];
echo $twig->render('greet.twig', ['name' => $name]);
# 使用 Jinja2 的易受攻击的 Python 代码
from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/greet')
def greet():
    # 将用户输入直接注入到模板中
    username = request.args.get('username')
    return render_template('greet.html', username=username)

建议

  • 尽可能避免从用户输入创建模板
  • 考虑使用简单的无逻辑模板引擎,例如 Mustache
  • 在禁用了有风险的模块和功能的沙盒环境中渲染模板。
  • 在将用户输入传递到模板之前对其进行净化

示例

# app.rb
require 'sinatra'
require 'mustache'

class ExampleTemplate < Mustache
  def initialize(name)
    @name = name
  end

  def greeting
    "Hello, #{@name}!"
  end
end

get '/greet/:name' do
  name = params['name']
  template = ExampleTemplate.new(name)
  erb template.render
end
<!-- index.php -->
<?php
require 'Mustache/Autoloader.php';
Mustache_Autoloader::register();

$template = new Mustache_Engine;

$name = $_GET['name'] ?? 'World';
$data = ['name' => $name];
echo $template->render('Hello, {{name}}!', $data);
?>
from flask import Flask, render_template
from flask import request
import pystache

app = Flask(__name__)

# 定义一个简单的 Mustache 模板
template = """
<html>
<head>
    <title>Greeting Page</title>
</head>
<body>
    <h1>Hello, {{name}}!</h1>
</body>
</html>
"""

# 创建一个 Mustache 渲染器
mustache_renderer = pystache.Renderer()

@app.route('/')
def greet_user():
    # 从 URL 获取 'name' 查询参数
    user_name = request.args.get('name', 'Guest')

    # 渲染带有用户姓名的模板
    rendered_template = mustache_renderer.render(template, {'name': user_name})

    # 返回渲染的 HTML
    return rendered_template

if __name__ == '__main__':
    app.run(debug=True)

链接

标准

  • CWE_TOP_25:
    • CWE_94
  • GDPR:
    • ART_5
    • ART_32
  • PCI_STANDARDS:
    • REQ_6_5
    • REQ_11_3
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_3_4
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213
    • SECURITY255