原文:https://medium.com/@david.valles/gaining-shell-using-server-side-template-injection-ssti-81e29bb8e0f9

在本文中,我们将为读者演示如何利用服务器端模板注入(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

源链接

Hacking more

...