利用服务端模板注入漏洞
翻译
原文:https://portswigger.net/web-security/server-side-template-injection/exploiting
- name: 翻译
desc: 原文:https://portswigger.net/web-security/server-side-template-injection/exploiting
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# 1利用服务端模板注入漏洞
在本节中,我们将更仔细地研究一些典型的服务端模板注入 (opens new window)漏洞,并演示如何使用我们的高级方法 (opens new window)来利用这些漏洞。将此过程付诸实践之后,你可以潜在地发现 和 利用各种不同的服务端模板注入漏洞。
一旦发现服务端模板注入漏洞,并确定目标所使用的模板引擎之后,成功利用该漏洞通常涉及以下过程。
# 2阅读
除非你已经对模板引擎了如指掌,否则 “阅读其文档” 通常是第一步。虽然这可能不是最令人兴奋的、消磨时间的方式,但重要的是不要低估 文档 这个可靠的信息来源。
# 2.1学习基本模板语法
学习基本语法 以及 关键函数和变量处理显然很重要。即使是像学习 如何在模板中嵌入本地代码块 这样简单的事情,有时也会很快导致漏洞被利用。例如,一旦你知道正在使用基于 Python 的 Mako 模板引擎,实现远程代码执行就可以像这样简单:
<%
import os
x=os.popen('id').read()
%>
${x}
2
3
4
5
在非沙箱环境中,实现远程代码执行并使用它来读取、编辑或删除任意文件,在许多常见的模板引擎中同样简单。
- name: 实验室-从业者
desc: 基本的服务端模板注入 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-basic
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
- name: 实验室-从业者
desc: 基本的服务端模板注入(代码上下文) >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-basic-code-context
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 2.2阅读有关安全隐患的信息
除了提供如何创建 和 使用模板的基础知识外,文档还可能提供某种 “安全性” 章节。这一章节的名称会有所不同,但它通常会概述 人们应该避免使用模板时 进行的所有潜在危险的事情。这可能是一个宝贵的资源,甚至可以作为一种备忘单,了解你在审计期间应该寻找哪些行为,以及如何利用它们。
即使没有专门的 “安全” 章节,如果特定的内置对象 或 函数可能造成安全风险,文档中几乎总是会有某种警告。该警告可能不会提供太多细节,但至少,它应该将这个 特定的内置功能 标记为需要审查的内容。
例如,在 ERB 中,文档显示你可以列出所有目录,然后读取任意文件,如下所示:
<%= Dir.entries('/') %>
<%= File.open('/example/arbitrary-file').read %>
2
- name: 实验室-从业者
desc: 借助文档信息的服务端模板注入 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-using-documentation
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 2.3查找已知漏洞
利用 服务端模板注入漏洞 的另一个关键方面是,善于在线查找其他资源。一旦你能够识别目标正在使用的模板引擎,你就应该浏览 Web 以查找其他人已发现的任何漏洞。由于一些主要模板引擎被广泛使用,有时可以找到记录良好的漏洞载荷,你可以调整这些漏洞载荷,以攻击你自己的目标网站。
- name: 实验室-从业者
desc: 未知语言的服务端模板注入,记录在案的漏洞载荷 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-in-an-unknown-language-with-a-documented-exploit
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 3探索
此时,你可能已经通过文档,偶然发现了一些可行的漏洞利用行为。如果没有,下一步是探索环境,并尝试发现你有权访问的所有对象。
许多模板引擎公开某种类型的 “self” 或 “environment” 对象,其作用类似于 包含模板引擎支持的所有对象、方法和属性的命名空间。如果存在这种对象,则可以使用它来生成范围内的对象列表。例如,在基于 Java 的模板语言中,有时可以使用以下注入,来列出环境中的所有变量:
${T(java.lang.System).getenv()}
这可以创建一个潜在有趣对象 和 方法的候选列表,以便进一步研究。此外,对于Burp Suite Professional (opens new window)用户,Intruder 提供了一个用于暴破变量名的内置单词列表。
# 3.1开发人员提供的对象
需要注意的是,网站除了包含模板提供的内置对象以外,还包含 Web 开发人员针对特定站点的自定义对象。你应该特别注意这些非标准对象,因为它们及其可能包含敏感信息 或 可利用的方法。由于这些对象在 同一网站中的不同模板之间 可能会有所不同,因此请注意,在找到利用对象的方法之前,你可能需要在每个 不同模板的上下文中 研究该对象的行为。
虽然服务端模板注入可能会导致 远程代码执行和完全接管服务器,但在实践中,这并不总是可以实现的。然而,即使你排除了远程代码执行,这不一定意味着没有其他类型的漏洞。你仍然可以利用 服务端模板注入漏洞 进行其他高严重性攻击(例如文件路径遍历 (opens new window))来访问敏感数据。
- name: 实验室-从业者
desc: 服务器端模板注入,通过用户提供的对象进行信息泄露 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-with-information-disclosure-via-user-supplied-objects
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 4创建自定义攻击
到目前为止,我们主要研究了 “重用记录在案的漏洞载荷” 或 “使用模板引擎中的已知漏洞” 来构建攻击。但是,有时你需要构建自定义漏洞载荷。例如,你可能会发现模板引擎在沙箱中解析模板,这可能会使攻击变得困难,甚至无法利用。
确定攻击面后,如果没有明显的方法来利用该漏洞,则应继续使用传统的审计技术,检查每个函数之中是否存在可利用的行为。有条不紊地完成此过程之后,你有时能够构建复杂的攻击,甚至能够攻击更安全的目标。
# 4.1使用对象链构造自定义漏洞载荷
如上所述,第一步是确定你有权访问的对象和方法。有些对象可能会立刻引起人们的兴趣。通过结合你自己的知识 和 文档中提供的信息,你应该把 想要审查的对象 集中放在一个候选列表中。
在研究对象的文档时,要特别注意这些对象 授予哪些方法访问权限,以及它们返回哪些对象。通过深入文档,你将发现可以被链接在一起的对象和方法组合。将正确的对象和方法链接在一起,有时会允许你访问危险功能和敏感数据,这最初看起来遥不可及。
例如,在基于 Java 的模板引擎 Velocity 中,你可以访问ClassTool
对象并调用$class
。通过研究文档,你可以链接$class.inspect()
方法和$class.type
属性来获取对任意对象的引用。在过去,这已经被用于在目标系统上执行 shell 命令,如下所示:
$class.inspect("java.lang.Runtime").type.getRuntime().exec("这里有坏东西")
- name: 实验室-专家
desc: 沙箱环境中的服务端模板注入 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-in-a-sandboxed-environment
bgColor: '#001350'
textColor: '#d112fe'
2
3
4
5
6
# 4.2使用开发人员提供的对象构造自定义漏洞
默认情况下,一些模板引擎在安全、封闭的环境中运行,以尽可能降低相关风险。尽管这使得 利用此类模板进行远程代码执行 变得困难,但由开发人员创建 并 公开于模板中的对象,可以提供更进一步、不那么容易审查的攻击面。
然而,尽管官方通常为 模板引擎 内置了大量文档,但几乎可以肯定的是,自定义对象根本没有文档。因此,要想利用这些漏洞,你需要手动调查网站的行为,以识别攻击面,并相应地构建自己的自定义漏洞载荷。
- name: 实验室-专家
desc: 使用自定义漏洞载荷的服务端模板注入 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-with-a-custom-exploit
bgColor: '#001350'
textColor: '#d112fe'
2
3
4
5
6