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