白头搔更短,SSTI惹人心!

白头搔更短,SSTI惹人心!

💡 原文中文,约10500字,阅读约需25分钟。
📝

内容提要

本文介绍Java服务端模板注入(SSTI)漏洞的原理与利用。以Velocity模板引擎为例,分析其evaluate和render方法如何解析用户输入,导致远程代码执行。并通过Apache Solr Velocity模板注入漏洞复现,展示攻击流程,最后补充#set、#foreach语法及POC构造方法,强调配置不当是漏洞根源。

🔎

延伸解读

SSTI并非Java专属,但Java案例较少

文章指出,虽然SSTI在Python(如Jinja2、Mako)和PHP(如Smarty、Twig)框架中较为常见,但Java相关的SSTI资料和CVE编号相对较少。这并不意味着Java不存在SSTI风险,而是可能因为Java模板引擎(如Velocity、FreeMarker)的使用场景和审计关注度不同。对于Java安全审计人员而言,了解SSTI原理和利用方式仍然重要,尤其是在配置不当或代码不规范的情况下。

配置不当是SSTI漏洞的根源

文章通过Apache Solr的案例强调,SSTI漏洞的根源在于配置不当或代码不规范,而非模板引擎本身。在Solr中,默认关闭的params.resource.loader.enabled选项被开启后,攻击者才能通过请求参数指定模板内容,进而触发注入。这提醒开发者,在使用模板引擎时,应严格限制用户输入对模板的控制,并遵循最小权限原则,避免启用不必要的功能。

理解模板语法有助于构造和防御POC

文章详细解析了Velocity的#set和#foreach语法,并展示了如何利用这些语法构造POC。例如,通过#set创建变量并调用Java类方法,或通过#foreach遍历命令输出。理解这些语法不仅有助于安全研究人员构造POC,也有助于开发者识别和防御潜在的模板注入攻击,例如对用户输入进行过滤或转义,避免直接拼接模板。

Q&A

什么是SSTI漏洞?

SSTI(服务端模板注入)是一种安全漏洞,当服务端使用模板引擎渲染用户输入时,由于代码不规范或信任用户输入,导致用户可控的模板内容被执行,可能造成远程代码执行。

Java中哪些模板引擎容易受到SSTI攻击?

Java中常见的模板引擎如FreeMarker、Velocity等,如果使用不当,将用户输入直接作为模板内容渲染,就可能产生SSTI漏洞。

Velocity模板引擎中evaluate方法是如何导致SSTI的?

Velocity的evaluate方法会将传入的字符串作为模板进行解析和渲染。如果该字符串包含用户可控的输入,攻击者可以通过构造特殊的模板语法(如#set)来执行任意Java代码,从而导致远程代码执行。

Apache Solr Velocity模板注入漏洞是如何被利用的?

攻击者首先通过Solr的Config API修改配置,启用params.resource.loader.enabled选项,然后构造包含恶意Velocity模板的请求参数,通过v.template.custom参数传入,最终执行任意系统命令。

在Velocity模板中,如何构造POC来执行系统命令?

可以使用#set指令创建变量,通过反射获取Runtime类并调用exec方法执行命令,例如:#set($x='') #set($rt=$x.class.forName('java.lang.Runtime')) #set($ex=$rt.getRuntime().exec('whoami'))。

Velocity模板中的#set和#foreach语法有什么作用?

#set用于创建变量或调用set方法,#foreach用于循环遍历集合。在SSTI攻击中,攻击者常利用#set进行赋值和反射调用,利用#foreach读取命令执行结果。

Apache Solr Velocity模板注入漏洞的根本原因是什么?

根本原因是Solr的Config API允许未授权用户修改配置,且VelocityResponseWriter的params.resource.loader.enabled选项默认关闭,但管理员可能错误地开启,导致用户可以通过请求参数指定模板内容,从而引发注入。

如何防止SSTI漏洞?

防止SSTI的关键在于不要将用户输入直接作为模板内容,对用户输入进行严格的过滤和转义,同时确保模板引擎的配置安全,如关闭不必要的资源加载器,并加强访问控制。

🏷️

标签

➡️

继续阅读