Web安全学院
Web安全学院
  • 首页
  • 译序
  • 学习路线
  • 前篇
    • Web应用程序安全测试
    • 动态应用程序安全测试(DAST)
    • 带外应用程序安全测试(OAST)
  • 服务器端主题
    • SQL注入
      • SQL注入
      • SQL注入UNION攻击
      • 在SQL注入攻击中检索数据库
      • SQL盲注
      • SQL注入速查表
    • 认证
      • 认证漏洞
      • 基于密码登录中的漏洞
      • 多因素认证中的漏洞
      • 其他认证机制中的漏洞
      • 如何保护你的认证机制
    • 目录遍历
      • 目录遍历
    • 命令注入
      • OS命令注入
    • 业务逻辑漏洞
      • 业务逻辑漏洞
      • 业务逻辑漏洞示例
    • 信息泄露
      • 信息泄露漏洞
      • 如何发现并利用信息泄露漏洞
    • 访问控制
      • 访问控制漏洞与权限提升
      • 不安全的直接对象引用(IDOR)
      • 访问控制安全模型
    • 文件上传漏洞
      • 文件上传漏洞
    • 条件竞争
      • 条件竞争
    • 服务器端请求伪造(SSRF)
      • 服务器端请求伪造(SSRF)
      • 盲SSRF漏洞
    • XXE注入
      • XML外部实体(XXE)注入
      • XML实体
      • 发现并利用盲XXE漏洞
  • 客户端主题
    • 跨站脚本(XSS)
      • 跨站脚本
      • 反射型XSS
      • 存储型XSS
      • 基于DOM的XSS
      • XSS上下文
        • 跨站脚本上下文
        • 客户端模版注入
      • 利用跨站脚本漏洞
      • 内容安全策略
      • 悬空标记注入
      • 如何防范XSS漏洞
      • 跨站脚本(XSS)速查表
    • 跨站请求伪造(CSRF)
      • 跨站请求伪造(CSRF)
      • XSS与CSRF
      • 绕过CSRF令牌验证
      • 绕过SameSite Cookie限制
      • 绕过基于Referer的CSRF防御
      • 如何防范CSRF漏洞
    • 跨域资源共享(CORS)
      • 跨域资源共享(CORS)
      • 同源策略(SOP)
      • CORS和Access-Control-Allow-Origin响应标头
    • 点击劫持
      • 点击劫持(UI伪装)
    • 基于DOM的漏洞
      • 基于DOM的漏洞
      • 控制Web消息源
      • 基于DOM的开放重定向
      • 基于DOM的Cookie操纵
      • 基于DOM的JavaScript注入
      • 基于DOM的document-domain操纵
      • 基于DOM的WebSocket URL投毒
      • 基于DOM的链接操纵
      • Web消息操纵
      • 基于DOM的Ajax请求标头操纵
      • 基于DOM的本地文件路径操纵
      • 基于DOM的客户端SQL注入
      • 基于DOM的HTML5 Storage操纵
      • 基于DOM的客户端XPath注入
      • 基于DOM的客户端JSON注入
      • DOM-data操纵
      • 基于DOM的拒绝服务
      • DOM破坏
    • WebSocket
      • 测试WebSocket安全漏洞
      • 什么是WebSocket?
      • 跨站WebSocket劫持
  • 进阶主题
    • 不安全的反序列化
      • 不安全的反序列化
      • 利用不安全的反序列化漏洞
    • 测试GraphQL API
      • 测试GraphQL API
      • 什么是GraphQL?
    • 服务器端模板注入
      • 服务器端模板注入
      • 利用服务器端模板注入漏洞
    • Web缓存投毒
      • Web缓存投毒
      • 缓存设计缺陷的利用
      • 缓存实现缺陷的利用
    • HTTP Host标头攻击
      • HTTP Host标头攻击
      • 如何识别和利用HTTP Host头的漏洞
      • 密码重置投毒
    • HTTP请求走私
      • HTTP请求走私
      • 查找HTTP请求走私漏洞
      • 利用HTTP请求走私漏洞
      • 高级请求走私
        • 高级请求走私
        • HTTP/2降级
        • 响应队列投毒
        • HTTP/2专属载体
        • HTTP请求隧道
      • 浏览器驱动的请求伪造
        • 浏览器驱动的请求伪造
        • CL.0请求走私
        • 客户端异步攻击
        • 基于暂停的异步攻击
    • OAuth认证
      • OAuth 2.0认证漏洞
      • OAuth授权类型
      • OpenID Connect
      • 如何防范OAuth认证漏洞
    • JWT攻击
      • JWT攻击
      • 在Burp Suite中使用JWT
      • 算法混淆攻击
    • 原型污染
      • 什么是原型污染?
      • JavaScript原型和继承
      • 客户端
        • 客户端原型污染漏洞
        • 通过浏览器API进行原型污染
      • 服务器端
        • 服务器端原型污染
      • 预防原型污染漏洞
    • 基本技能
      • 基本技能
      • 使用编码混淆攻击
      • 在手动测试中使用Burp Scanner
Powered by GitBook
On this page
  • 阅读
  • 学习基础的模板语法
  • 阅读有关安全问题的内容
  • 寻找已知的攻击手段
  • 探索
  • 开发者提供的对象
  • 创建定制利用
  • 使用对象链构造定制利用
  • 使用开发者提供的对象构造定制利用方法
  1. 进阶主题
  2. 服务器端模板注入

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

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

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

  • 阅读

    • 模板语法

    • 安全文档

    • 已记录的攻击手段

  • 探索环境

  • 创建定制攻击

阅读

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

学习基础的模板语法

学习基础的语法显然很重要,以及关键函数和变量处理。即使是像学习如何在模板中嵌入原生代码块这样简单的事情,有时也会迅速导致漏洞的出现。例如,一旦你知道正在使用基于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中,你可以访问一个名为$class的ClassTool对象。研究文档可以发现,你可以通过链接$class.inspect()方法和$class.type属性来获得对任意对象的引用。在过去,这已经被用来在目标系统上执行shell命令,如下所示:

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

LAB

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

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

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

LAB

Previous服务器端模板注入NextWeb缓存投毒

Last updated 1 year ago

基础的服务器端模板注入
基础的服务器端模板注入(代码背景)
使用文档进行服务器端模板注入
使用有记录的利用方法在一个未知的语言中进行服务器端模板注入
通过用户提供的对象泄露信息来服务器端模板注入
沙盒环境下的服务器端模板注入
使用定制利用的服务器端模板注入