服务器端模板注入漏洞简介

译者 | 刘涛

审校 | 重楼

服务器端模板注入(SSTI)漏洞是网络应用安全中不太为人所知的一种漏洞类型。尽管这些漏洞很少见,但一旦被发现,其影响往往非常严重,通常会导致远程代码执行(RCE)。

本文旨在揭示这些问题是如何产生的,并找出它们在现实环境中经常出现的地方。

什么是服务器端模板(Server-Side Templates)

现代网络严重依赖于大量的用户信息、产品细节和各种其他类型的数据。为了以有意义的方式呈现这些信息,就需要在网页上对它们进行有效的组织,这样用户才能快速找到最重要的信息;这也是用户从精选的搞笑图片页面中获得快乐的方式。

模板语言和框架引入了特殊的语法和结构,使开发人员能够创建包含静态内容的模板,同时提供的语法和结构允许动态内容在不需要混合后端和前端代码的情况下呈现。

安全问题从何而来?

如果攻击者可以发送请求,从而使服务器的模板引擎把用户的输入当作模板来处理,那么就会产生安全问题。一个好的安全评估在寻找这类漏洞时,需要专注考虑以下几个方面:

管理员功能 – 允许管理员定制页面,横幅,或者应用程序中的其他可视元素,有时还会提供模版作为一项特色。一些开发人员甚至可能选择允许访问模板语言,从而打开这个漏洞。

未经过滤的输入 – 任何可能返回给用户或显示在另一页上的输入都可能导致SSTI,具体取决于网站的功能。既然理解了模板语言的用例,那么请戴上您的开发帽,思考您会在哪些地方使用模板。

测试SSTI漏洞

如果怀疑应用程序存在SSTI漏洞,那么在应用程序中可以使用一些模板语言。测试越有针对性,效果越好。如果能够通过侦测确定应用程序的开发语言(如Python/Java/PHP等),则可以为目标语言中常用的模板框架创建测试有效载荷。

SSTI Polyglot Payload

SSTI Polyglot有效载荷旨在跨多个框架和语言测试SSTI漏洞。在源代码未知的情况下,它可以辅助测试。但由于此特定有效载荷很常见,且包含大量特殊字符(如${{<%[%'”}}%),所以它更可能被输入过滤( input sanitization)拦截或被防火墙(WAFs)阻断。

可以考虑在请求中使用有效载荷,以在目标应用程序上触发某种错误消息。

GET/search?query=${{<%[%'"}}%\.
Python - Jinja2(Python的一组模板引擎)

一个简单的用于测试应用程序是否正在处理Jinja模板的有效载荷是{{7*7}},如果应用程序正在处理该模板,则页面上将显示49。

为了进一步提升这个有效载荷,您可以尝试使用下面的示例来使用Python的OS包执行date命令。

{{self.__init__.__globals__.__builtins__.__import__('os').popen('date').read()}}

在使用上述示例时,您正在使用Jinja来执行OS功能,从而执行OS命令,而这些应该包含在应用程序的类路径中。如果应用程序的运行环境特别严格,但您有一个可行的SSTI POC(证明服务器端模板注入漏洞存在漏洞利用代码),您可以考虑深入研究应用程序使用的任何其他Python包。例如,您尝试通过SSTI访问常用的requests包以进行进一步地利用。这类似于您可能在反序列化漏洞中看到的应用开发方式。

Jinja 过滤器旁路

您也应该知道,对于Jinja2 应用防火墙和应用程序过滤器存在绕过方法。过滤器和相关的绕过方法总是在变化,但是下面是您可能会看到的常见过滤器。

防火墙可能会拦self.__init__.__globals__.__builtins__.的某些部分。如果是这种情况,使用attr()可能会有所帮助,因为它可以直接访问builtins(内置函数)对象。

{{ request|attr('builtins')|import('os')|popen('date')|read}}

深入研究过滤器绕过方法,您可以让Python帮助转换有效载荷!例如,使用format()可以在处理模板引擎时转换有效载荷。当某些组合. or_被阻止时,这将有所帮助。

{{ request|format('%s%sbuiltins%s%s')|import('os')|popen('date')|read}}

Java模板注入

Java有更多的模板框架需要应对,可能好坏参半。基于Spring的Web应用程序非常常见,Baeldung有一个很棒的列表,网址如下:https://www.baeldung.com/spring-template-engines

ThymeLeaf(Java服务器端模板引擎)注入

这是 Java中常见的一种模板引擎类型,其利用 SSTI漏洞的方法已广为人知。做个简单的测试,看看是否存在模板注入漏洞,可以再次使用${7*7}这个方法,如果您在响应中看到49而不是模板,那就意味着存在问题。

这种RCE有效载荷(一种远程代码执行的有效载荷)有两种变体,Spring Expression Language (SpringEL) 和 Object Graph Navigation Language (OGNL)。SpringEL比较流行,也比较现代化,但是您可能会发现 OGNL模板仍然被使用。这里是我们的示例,再次执行date命令。

SpringEL ${T(java.lang.Runtime).getRuntime().exec(‘date’)}
OGNL ${#rt = @java.lang.Runtime@getRuntime(),#rt.exec(‘date’)}

结束语

尽管本文只是一个简单的介绍,但希望您能了解这些漏洞是如何被利用以及它们是如何产生的。这并没有涵盖所有可能的SSTI有效载荷和框架,但我建议您深入研究。

延伸阅读

https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server Side Template Injection/README.md

https://portswigger.net/web-security/server-side-template-injection

译者介绍

刘涛,IDC.NET社区编辑,某大型央企系统上线检测管控负责人。

原文标题:An Introduction to Server Side Template Injection Bugs,作者:David Neal

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/135362.html<

(0)
管理的头像管理
上一篇2025-03-01 14:16
下一篇 2025-03-01 14:17

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注