利用服务器端模板注入漏洞

在本节中,我们将更仔细地研究一些典型的服务器端模板注入漏洞,并演示如何使用我们的高级方法来利用它们。通过将这一过程付诸实践,你可以潜在地发现并利用各种不同的服务器端模板注入漏洞。

一旦发现了服务器端模板注入漏洞,并确定了正在使用的模板引擎,成功的利用通常涉及以下过程。

  • 阅读

    • 模板语法

    • 安全文档

    • 已记录的攻击手段

  • 探索环境

  • 创建定制攻击

阅读

除非你已经对模板引擎了如指掌,否则阅读其文档通常是开始的第一步。虽然这可能不是最令人兴奋的方式来度过你的时间,但不要低估文档作为信息来源的价值。

学习基础的模板语法

学习基础的语法显然很重要,以及关键函数和变量处理。即使是像学习如何在模板中嵌入原生代码块这样简单的事情,有时也会迅速导致漏洞的出现。例如,一旦你知道正在使用基于Python的Mako模板引擎,那么实现远程代码执行可能就像这样简单:

<%
                import os
                x=os.popen('id').read()
                %>
                ${x}

在一个没有沙盒的环境中,实现远程代码执行并利用它来读取、编辑或删除任意文件,在许多常见的模板引擎中也同样简单。

LAB

基础的服务器端模板注入

LAB

基础的服务器端模板注入(代码背景)

阅读有关安全问题的内容

除了提供如何创建和使用模板的基础知识外,文档还可能提供某种“安全”部分。这一部分的名称可能有所不同,但它通常会概述所有可能的危险操作,以及人们应该避免在模板中执行的操作。这可能是一个非常有价值的资源,甚至可以作为一个备忘单,告诉你在审计过程中应该寻找哪些行为,以及如何利用它们。

即使没有专门的“安全”部分,如果某个built-in对象或函数可能带来安全风险,文档中几乎总会有某种警告。警告可能不会提供太多细节,但至少应该将此特定built-in标记为需要调查的对象。

例如,在ERB中,文档显示,你可以列出所有目录,然后读取任意文件,如下所示:

<%= Dir.entries('/') %>
<%= File.open('/example/arbitrary-file').read %>

LAB

使用文档进行服务器端模板注入

寻找已知的攻击手段

利用服务器端模板注入漏洞的另一个关键方面是擅于在网上寻找其他资源。一旦能够确定所使用的模板引擎,你就应该在网上浏览其他人可能已经发现的漏洞。由于一些主要的模板引擎被广泛使用,有时可以找到详细记录的利用方法,你可以对其进行调整以利用自己的目标网站。

LAB

使用有记录的利用方法在一个未知的语言中进行服务器端模板注入

探索

此时,你可能已经通过文档偶然找到了一个可行的利用方法。如果没有,下一步就是探索环境,尝试发现你可以访问的所有对象。

许多模板引擎都暴露了一种“self”或“environment”对象,它就像一个命名空间,包含了模板引擎支持的所有对象、方法和属性。如果存在这样的对象,你可以用它来生成一个范围内对象的列表。例如,在基于Java的模板语言中,有时可以使用以下注入来列出环境中的所有变量:

${T(java.lang.System).getenv()}

这可以为创建一个潜在的有趣对象和方法的候选列表奠定基础,以便进一步研究。此外,对于Burp Suite Professional用户,Intruder还提供了一个用于暴力破解变量名称的built-in字典。

开发者提供的对象

值得注意的是,网站包含由模板提供的built-in对象和由Web开发者提供的自定义、站点特定的对象。你应该特别关注这些非标准对象,因为它们很可能包含敏感信息或可利用的方法。由于这些对象在同一网站的不同模板之间可能会有所不同,请注意,你可能需要在每个独立模板的上下文中研究对象的行为,然后才能找到利用它的方法。

虽然服务器端模板注入有可能导致远程代码执行和对服务器的完全接管,但实际上并不总是能够实现的。然而,仅仅因为你已经排除了远程代码执行,并不一定意味着没有其他类型攻击的可能。你仍然可以利用服务器端模板注入漏洞进行其他高危攻击,例如目录遍历,以获取敏感数据。

LAB

通过用户提供的对象泄露信息来服务器端模板注入

创建定制利用

到目前为止,我们主要关注了通过重用已记录的利用方法或使用模板引擎中的知名漏洞来构造攻击。然而,有时候你需要构造一个定制的利用方法。例如,你可能会发现模板引擎在沙盒中执行模板,这可能使得利用变得困难,甚至不可能。

在确定了攻击面之后,如果没有明显的方式来利用该漏洞,你应该继续使用传统的审计技术,通过检查每个函数的可利用行为。通过有条不紊地完成这个过程,有时可能能够构造一个复杂的攻击,甚至可以利用更安全的目标。

使用对象链构造定制利用

如上所述,第一步是确定你可以访问的对象和方法。其中一些对象可能会立马引起你的兴趣。通过结合自己的知识和文档中提供的信息,应该能够整理出一份你想更深入研究的对象的候选清单。

在研究对象的文档时,请特别注意它们允许访问哪些方法,以及它们返回哪些对象。通过深入文档,你可以发现可以链接在一起的对象和方法的组合。将正确的对象和方法链接在一起,有时可以让你访问到一开始看似触不可及的危险功能和敏感数据。

例如,在基于Java的模板引擎Velocity中,你可以访问一个名为$classClassTool对象。研究文档可以发现,你可以通过链接$class.inspect()方法和$class.type属性来获得对任意对象的引用。在过去,这已经被用来在目标系统上执行shell命令,如下所示:

$class.inspect("java.lang.Runtime").type.getRuntime().exec("bad-stuff-here")

LAB

沙盒环境下的服务器端模板注入

使用开发者提供的对象构造定制利用方法

有些模板引擎默认在一个安全的、锁定的环境中运行,以便尽可能地降低相关风险。尽管这使得利用这些模板进行远程代码执行变得很困难,但开发者创建的暴露在模板上的对象可以提供一个进一步的、不太受战斗考验的攻击面。

然而,虽然通常为模板built-in提供了大量文档,但几乎可以肯定,特定于站点的对象根本没有文档。因此,研究如何利用它们将需要你手动调查网站的行为,以识别攻击面并相应地构造自己定制的利用方法。

LAB

使用定制利用的服务器端模板注入

Last updated