代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

admin 2025年6月23日22:03:21评论7 views字数 2979阅读9分55秒阅读模式
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

本篇为代码审计系列SSTI服务器端模板注入漏洞理论篇-Thymeleaf第九篇,看完本篇你将掌握关于Thymeleaf模版注入漏洞的代码视角原理剖析、基础挖掘漏洞核心能力,看完如有技术错误欢迎评论区指正。

  • Thymeleaf概念

  • 业务视角Thymeleaf流程

  • 漏洞视角Thymeleaf漏洞原理及防范(Thymeleaf3.0.11版本)

  • Rouyi实战审计案例(Thymeleaf3.0.12版本)

Thymeleaf模版注入漏洞

Thymeleaf

        Thymeleaf 的模板引擎通过将模板与数据模型结合,实现了动态内容的渲染,适用于各种 Web 开发场景。

1.1Thymeleaf引擎

        引擎是 Thymeleaf 的核心组件,负责解析模板、处理动态表达式,并将模板与数据模型结合生成最终的输出内容。

1.2Thymeleaf模版

        模板是 Thymeleaf 中用于定义页面结构和内容的文件,通常是 HTML 文件。模板中包含了静态内容和动态占位符(Thymeleaf 表达式),这些占位符会在渲染时被替换为实际的数据。如下图所示:${user.name}和${user.email}是 Thymeleaf 表达式,会在渲染时被替换为实际的数据。

业务视角Thymeleaf场景流程

Thymeleaf数据流转流程

  • 用户请求阶段:用户通过浏览器向服务器发送 HTTP 请求(如 GET、POST 请求)

  • 数据绑定Model:控制器将数据绑定到Model对象中,Model是 Spring MVC 提供的一个接口,用于在控制器和视图之间传递数据

  • Thymeleaf视图解析器:Spring MVC 根据控制器返回的视图名称(如"greeting")调用 Thymeleaf的视图解析器(ThymeleafViewResolver)来解析模板。

  • Thymeleaf 引擎处理模板:Thymeleaf 引擎根据模板名称找到对应的模板文件(如greeting.html),并将数据渲染到模板中。

    • TemplateEngine:Thymeleaf 的核心类,负责模板的解析和渲染。

    • Context:Thymeleaf 的上下文对象,用于存储模板中使用的变量。

    • TemplateResolver:负责定位模板文件(如从类路径、文件系统等)。

  • 模板渲染:Thymeleaf 根据模板文件和数据生成最终的 HTML 内容。

2.1Thymeleaf使用流程

  • 定义模板:开发者编写 Thymeleaf 模板文件(通常是 HTML 文件),定义页面结构和动态占位符。
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
  • 准备数据模型:在后端代码中,准备需要渲染的数据模型。

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
  • 渲染模板:Thymeleaf 的TemplateEngine将模板与数据模型结合,生成最终的 HTML 内容。

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
  • 返回渲染结果:将渲染后的 HTML 内容返回给客户端(如浏览器)。

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

 漏洞视角Thymeleaf模版原理及防范

Thymeleaf模版注入漏洞属于SSTI类漏洞,触发漏洞根因是在用户输入参数后模板渲染前Thymeleaf引擎使用Spel解析阶段造成Payload被执行,且不同版本的Thymeleaf模版会有不同的漏洞触发场景。

3.1漏洞场景研究

示例漏洞场景项目https://github.com/veracode-research/spring-view-manipulation/

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

Thymeleaf模版版本为3.0.11

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

3.1.1表达式拼接注入

直接拼接注入表达式经测试不可行

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

输入表达式无法进行拼接模版注入

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

测试模版是否能解析SPEL表达式:StandardDialect:Thymeleaf 使用`StandardDialect`来处理标准表达式(如`${...}`)。可以通过检查`StandardDialect`是否被注册来确定表达式解析是否启用。

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

发现开启了表达式的解析

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

模版修改为Payload形式直接访问测试

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

访问show接口发现也能直接解析Spel表达式

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

那么只有一种可能:Spel中getValue()处理完模版中固定的Spel表达式再渲染的Html,而不是解析传入的Spel表达式到SPELVariableExpressionEvaluator.java中的getValue()方法进行下断发现传入的是模版中写死的$message表达式并非__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("calc").getInputStream()).next()}__::.x::

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

Spel表达式流程发现:ThymeleafView.java中吧templateName是核心内容,主要是传参可控制模版名字

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

将${message}作为input传进去,后续将作为直接解析

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

3.1.2return模版路径表达式解析

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

3.1.3分段表达式注入return模版路径表达式解析

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

3.1.4Url表达式注入

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

实战审计案例

此篇RouYi-v4.7.1为分析Thymeleaf漏洞进行白盒方式审计模版注入漏洞。部署后从系统功能视角到源代码定位及抓包调试进行讲解。

白盒审计思路- 关键词定位Control层- 查看是否存在注入点- return or url模版路径可拼接进行给视图传参数

4.1RouYi-v4.7.1漏洞项目部署

Gitee项目地址:https://gitee.com/y_project/RuoYi/compare/v4.7.1...v4.7.2

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

直接打开Pom.xml引入依赖即可,查看thymeleaf版本2.1.0

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

启动项目

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

导入2个数据库文件,并修改数据库账号密码,成功启动项目

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

4.2白盒源代码漏洞分析

定位SpringBoot中Thymeleaf模版配置项及前端模版位置

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

关键词定位:在Thymeleaf漏洞中的业务代码,会在控制器(Controller)和视图(View)之间传递数据。它们的主要作用是将数据从控制器传递到 Thymeleaf 模板,以便在模板中渲染这些数据

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

使用关键词定位Control层,看样子用的ModelMap

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

DemoOperateController.java中修改用户方法返回视图模版

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

第二处也不可控

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

查找到CacheController.java发现惊喜,return路径可直接传参数控制

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

Rouyi的模版版本为3.0.12,需要定位此版本Payload才可以

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

根据描述信息3.0.12防护信息需要进行Url编码并且进行空格处理才可绕过

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

源码跟踪3.0.12绕过方式

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

发现使用SpringSecurity框架中的一个工具类:SpringStandardExpressionUtils.java用于检测 SpEL具体逻辑如下:1.倒序扫描表达式字符串,逐字符匹配"new"关键字(使用倒序方式匹配 "wen")。检查匹配到的 "new" 是否为独立关键字,而非标识符的一部分。2.同时检测类似 T(SomeClass) 的静态方法调用形式。如果发现上述两种情况之一,则返回 true,表示存在受限操作。

代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

所以此时需要先查看SpringEL表达式是否从语法方面绕过:支持"T (SomeClass)"这样的语法,因此我们只要在T与恶意Class之间加个空格

END

原文始发于微信公众号(闪石星曜CyberSecurity):代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞

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

发表评论

匿名网友 填写信息