在本文中,我们将为读者演示如何利用服务器端模板注入(SSTI)漏洞来取得托管应用程序的服务器的Shell。
我们都知道,由于模板引擎支持使用静态模板文件,并在运行时用HTML页面中的实际值替换变量/占位符,从而让HTML页面的设计变得更容易。当前广为人知且广泛应用的模板引擎有Smarty、Twig、Jinja2、FreeMarker和Velocity。
如果攻击者能够把模板指令作为用户输入进行注入,并且这些指令可以在服务器上执行任意代码的话,那么他们离服务器端模板注入攻击也不远了。如果在web页面的源代码中看到了下面的代码片段,那么,就可以大胆断定该应用程序正在使用某些模板引擎来呈现数据。
var greet = ‘Hello $name’;
<ul>
<% for(var i=0; i<data.length; i++)
{%>
<li><%= data[i] %></li>
<% }
%>
</ul>
<div>
<p> Welcome, {{ username }} </p>
</div>
由于我喜欢体验式学习,对于SSTI攻击也不会例外,所以,我就借助Sanoop Thomas和Saman编写的Xtreme Vulnerable Web Application(XVWA)来练手,因为其中的一项挑战,就是关于SSTI漏洞。我强烈建议大家也不妨动手试一试,大家可以从这里下载该软件。
首先,我注入了探测字符串${{1300+37}},以查看应用程序是否进行了相应的计算。根据服务器响应来看,得到的结果为 $1337 。根据这个响应,我们可以推测这里使用了模板引擎,因为这符合它们对于{{}}的处理方式。
注入探针字符串
响应中的数值1337
实际上,页面本身就表明它是一个TWIG模板引擎。那么,除了单纯的数学运算评估之外,我们还能利用这种注入漏洞做些什么呢?这让我想到了詹姆斯•凯特尔(James Kettle)所做的一项令人敬佩的研究。如下所示,这个有效载荷能够恶意利用模板指令执行“id”命令。
执行代码的载荷
命令“id”的输出内容
这简直太棒了,但更让我心仪的却是获取服务器的Shell。于是,我马上生成了一个php meterpreter有效载荷,并让它在服务器上执行以获得远程Shell。搞定!
php meterpreter有效载荷
Metasploit 侦听器
下载并执行php meterpreter有效载荷
Meterpreter Shell
对于不同的模板引擎,该漏洞的修复方法会有所不同,但如果在传递给模板指令之前,对用户输入进行安全过滤的话,则可以大大减少这类威胁。此外,另一种防御方法是使用沙箱环境,将危险的指令删除/禁用,或者对系统环境进行安全加固。
参考文献:
https://portswigger.net/blog/server-side-template-injection
https://nvisium.com/blog/2016/03/11/exploring-ssti-in-flask-jinja2-part-ii.html