允许用户在TWIG中添加任何代码是否是一个安全漏洞?



在我的应用程序中,我想允许用户添加自己的Twig代码。但是,我不希望它执行任何后端代码(如PHP代码来访问数据库或文件(。我已经使用 php 代码进行了测试<?php print "hello"; ?>.我可以看到PHP代码没有在Twig页面上执行。

据我所知,我可以说除非调用扩展名,否则无法在 Twig 文件中执行 PHP 代码(可以操作文件或数据库(。

但是,我只是想知道更多的建议。

你可以看看twig的沙盒扩展。您可以设置策略并显式定义每个标记、筛选器、方法、属性和函数。这是我在通过安全渗透测试通过申请后得到的建议。您可以全局设置它,也可以在呈现用户树枝输入的控制器中设置它。

https://twig.symfony.com/doc/2.x/tags/sandbox.html

https://twig.symfony.com/doc/2.x/api.html#sandbox-extension

/**
* Adds sandbox limitations to twig-environment to prevent template-injections
*
* @return Twig_Environment
*/
private function getSandboxedTwigEnvironment()
{
$tags = array('if', 'include', 'import', 'block', 'set', 'for');
$filters = array('date', 'escape', 'trans', 'split', 'length', 'slice', 'lower', 'raw');
$methods = array();
$properties = array();
$functions = array('include', 'path', 'absolute_url', 'asset', 'is_granted');
$policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
$sandbox = new Twig_Extension_Sandbox($policy);
$twigEnvironment = $this->getCentralService()->getTwigEnvironment();
$twigEnvironment->addExtension($sandbox);
return $twigEnvironment;
}

如果将任何禁止的标签、过滤器等添加到用户输入中,则会抛出Twig_Sandbox_SecurityError的例外情况。

如果你的任何上下文参数(你用来渲染模板的参数(是实现 ArrayAccess 接口的对象,要小心 - 在某些情况下,这些参数可以绕过沙箱中的属性/方法策略,因为 Twig 将它们视为数组。 例如,尝试传递一个 Eloquent Model,您会注意到尽管有 100% 严格的安全策略,但您可以轻松访问属性和关系(甚至可能能够执行查询方法!

你可能想看看黑帽演讲 - https://www.blackhat.com/docs/us-15/materials/us-15-Kettle-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-wp.pdf

可以使用它在服务器上执行代码,但它们仍然需要绕过沙箱。

相关内容

最新更新