服务器端模板注入
您是否注意到某些电子邮件(包含大量广告的电子邮件)是如何发送给你的账号呢?这是工作中的服务器端模板引擎。
最常用的一些服务器端模板引擎是Smarty,Mako,Twig和Jinja2。Web应用程序通常使用这些模板引擎在网页和电子邮件上显示动态数据。
例如:wiki,博客,内容管理系统和营销应用程序等。此功能允许将用户输入嵌入到Web应用程序中,如果未正确清理,可能会使其容易受到
服务器端模板注入的影响,并可能为入侵者提供远程代码执行(RCE)功能。在这篇博客中,我将教您如何识别和利用SSTI的基础知识,以及一些简单的解决方法。
识别SSTI漏洞
识别SSTI有时可以像在用户输入中提交无效语法一样简单,并使用生成的错误消息来检测服务器模板引擎。如果输入与服务器端变量连接并在
模板上呈现它,则表明模板易受SSTI攻击。例如,以下两个输入的输出显示服务器端的模板易受攻击:
Input: custom_email=25
Output: 25
Input: custom_email=
Output: Object of class _TwigTemplate_7ae62e582f8a35e5ea6cc639800ecf15b96c0d6f78db3538221c1145580ca4a5 could not be converted to string
有时,可能会抑制错误响应,从而难以识别正在使用的模板引擎以及是否容易受到攻击。但是,这些模板语言中使用的语法要求不与HTML字符冲突,
因此大多数这些语言共享相同的基本语法特征。我们可以通过使用单个HTTP请求发送通用有效负载来利用此功能,并立即探测多个模板引擎。
使用如下图所示的决策流程图方法,您可以识别正在使用的服务器端模板以及它是否容易受到攻击。该图显示了用于探测的不同payload,
并且仅考虑了四个最常用的服务器端模板引擎。如果输出是payload的数学计算,则模板易受攻击。
图像:用于标识正在使用的模板引擎的决策图表
附加 说明:您可以使用此图表自动使用ZAP或BURP探测模板引擎。
利用Flask应用程序利用SSTI
根据适当的模板引擎,有多种方法可以利用SSTI漏洞。它可能在几秒或几分钟内发生。例如:
对于Smarty模板引擎,像{php}echo ‘id’;{/php}
之类的输入可以为你提供root命令执行(RCE)访问。
对于Mako模板引擎,以下输入可以为您提供RCE访问权限。
<%
import os
x = os.popen('id')。read()
%>
$ {x}
一旦您知道哪个模板正在使用以及它是否容易受到攻击,就可以很容易地利用它。如果您是开发人员或新的安全爱好者,
我使用其中一个服务器端模板引擎创建了flask应用程序。(我故意不告诉你我现在使用的是哪种引擎。你必须自己解决这个问题。)
这个应用程序的主要功能是搜索存储的用户。如果您想在Flask应用程序上尝试测试此方法,则需要在此处下载该应用程序。(它包括如何下载和运行它以进行测试的说明)。
如果 您已完成下载应用程序,我们现在就可以开始了!因此,启动应用程序并查看它的外观。
首先要确定模板引擎是否易受攻击,以及正在使用哪个模板。使用我们之前讨论的决策流程图,尝试不同的输入并找出适当的模板。
图像:演示Flask应用程序主页
到目前为止,您应该知道哪个模板到位。根据输出,您可以将模板标识为Jinja2。
现在,让我们尝试利用此漏洞。Pyja2模板由Python Web框架使用。因此,您可以注入用python编写的payload以进行利用。
您可以在此阶段使用ZAP或BURP。我在这里使用BURP。如下图所示,我们将在REQUEST选项卡下注入以下有效负载。
%7b%7b+%27%27.__class__.__mro__%5B2%5D.__subclasses__%28%29%5B40%5D%28%27%2Fetc%2Fpasswd%27%29.read%28%29+%7D%7D
此有效负载请求从etc目录提供passwd 的文件内容。
图像:使用REQUEST下的Burp工具注入payload
图像:显示请求的响应
如果你看到(上图)的内容。如您所见,我们注入的有效负载返回200 OK响应。根据我们的REQUEST,响应是在/etc文件夹中显示来自passwd文件
的内容。它显示了服务器端文件系统的详细信息。从这里,您可能会找到多种方法来使用不同的工具来利用系统。我使用TPLmap工具进一步利用它。
我不会教你如何使用TPLmap(不管在这个博客中)如何利用它,但为了让你了解进一步利用SSTI的潜力,请参阅下一张图片。该图显示,
在我们访问先前注入的密码后,我们可以使用它来获取对其系统的shell访问权限。
图像:使用TPLmap工具获取shell访问权限
修复SSTI
既然你知道SSTI是什么,以及如何检测和利用它,你应该知道如何修复它。如果您是开发人员,那么这适合您。补救措施因所使用的不同模板引擎而异。因此,以下补救措施是概念性的,可以应用于所有模板引擎。
清理:将用户输入作为参数传递到模板中。在将输入传递到模板之前,通过在解析数据之前删除不需要的和有风险的字符来清理输入。这可以最大限度地减少任何恶意探测模板的漏洞。
沙盒:如果允许某些有风险的字符是呈现模板的某些属性的业务要求,则假定恶意代码执行是不可避免的。然后在docker容器中沙箱模板环境可能是一个更安全的选择。使用此选项,您可以使用docker安全性来创建一个限制任何恶意活动的安全环境。
参考文献:
Baris-sagdic:https://www.baris-sagdic.com/en/server-side-template-injection-ssti/
Portswigger:http://blog.portswigger.net/2015/08/server-side-template-injection.html