java安全 | Thymeleaf模板注入漏洞
字数 1377 2025-08-10 09:16:21

Thymeleaf模板注入漏洞详解

1. Thymeleaf模板引擎概述

Thymeleaf是一款与Java配合使用的服务端模板引擎,也是Spring官方支持的服务端模板引擎。其主要特点包括:

  • 支持HTML原型,在HTML标签中增加额外属性实现模板+数据展示
  • 默认前缀:/templates/,默认后缀:.html
  • SpringBoot默认整合Thymeleaf,无需额外配置
  • 相比JSP执行效率更高
  • 提供强大的工具支持

基本语法规则:

<!DOCTYPE HTML>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<div th:fragment="header">
  <h3>Spring Boot Web Thymeleaf Example</h3>
</div>
<div th:fragment="main">
  <span th:text="'Hello, ' + ${message}"></span>
</div>
<a th:href="@{/webjars/bootstrap/4.0.0/css/bootstrap.css}">test</a>
</html>

2. Thymeleaf标准表达式语法

Thymeleaf提供多种表达式语法:

  1. ${...} - 变量表达式(Variable Expressions)
  2. @{...} - 链接表达式(Link URL Expressions)
  3. #{...} - 消息表达式(Message Expressions)
  4. ~{...} - 代码块表达式(Fragment Expressions)
  5. *{...} - 选择变量表达式(Selection Variable Expressions)

常用th属性:

  • th:text:文本替换
  • th:utext:支持HTML的文本替换
  • th:value:属性赋值
  • th:each:遍历循环元素
  • th:if/th:unless/th:switch/th:case:条件判断
  • th:insert/th:replace/th:include:代码块引入
  • th:fragment:定义代码块
  • th:object:声明变量
  • th:attr:设置标签属性

3. Thymeleaf模板注入漏洞原理

Thymeleaf模板注入漏洞发生在开发者将用户可控数据直接拼接到模板中时,攻击者可以构造恶意表达式实现代码执行。

漏洞产生条件:

  1. 用户输入未经充分过滤直接拼接到模板
  2. 使用th:utext等允许解析HTML标签的属性
  3. 使用${...}等表达式直接解析用户输入

4. 漏洞利用方式

4.1 基本注入方式

当用户输入被直接拼接到模板表达式时:

@Controller
public class TestController {
    @GetMapping("/test")
    public String test(String input, Model model) {
        model.addAttribute("message", input);
        return "test";
    }
}

攻击者可构造payload:

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

4.2 表达式预处理注入

Thymeleaf支持表达式预处理,攻击者可利用此特性:

${#ctx.getVariable('param')}

4.3 URL链接表达式注入

利用@{...}表达式:

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

5. 漏洞防御措施

  1. 输入过滤

    • 对用户输入进行严格过滤,特别是特殊字符和表达式语法
  2. 输出编码

    • 使用th:text而非th:utext,避免HTML解析
    • 对动态内容进行HTML编码
  3. 安全配置

    • 限制模板解析模式
    • 禁用危险表达式功能
  4. 代码规范

    • 避免直接拼接用户输入到模板表达式
    • 使用安全的模板拼接方式

6. 漏洞检测方法

  1. 尝试插入简单表达式如${7*7}观察是否执行
  2. 测试各种表达式语法如#{...}@{...}
  3. 尝试XSS payload看是否被解析为HTML
  4. 检查错误信息中是否暴露模板引擎信息

7. 相关Java安全知识体系

Thymeleaf模板注入与以下Java安全知识相关:

  1. Java反射机制
  2. 类加载机制
  3. Spring框架安全
  4. JNDI注入
  5. SPEL表达式注入
  6. Java反序列化漏洞
  7. Fastjson反序列化漏洞

理解这些相关技术有助于全面掌握Thymeleaf模板注入漏洞的原理和防御方法。

Thymeleaf模板注入漏洞详解 1. Thymeleaf模板引擎概述 Thymeleaf是一款与Java配合使用的服务端模板引擎,也是Spring官方支持的服务端模板引擎。其主要特点包括: 支持HTML原型,在HTML标签中增加额外属性实现模板+数据展示 默认前缀:/templates/,默认后缀:.html SpringBoot默认整合Thymeleaf,无需额外配置 相比JSP执行效率更高 提供强大的工具支持 基本语法规则: 2. Thymeleaf标准表达式语法 Thymeleaf提供多种表达式语法: ${...} - 变量表达式(Variable Expressions) @{...} - 链接表达式(Link URL Expressions) #{...} - 消息表达式(Message Expressions) ~{...} - 代码块表达式(Fragment Expressions) *{...} - 选择变量表达式(Selection Variable Expressions) 常用th属性: th:text :文本替换 th:utext :支持HTML的文本替换 th:value :属性赋值 th:each :遍历循环元素 th:if / th:unless / th:switch / th:case :条件判断 th:insert / th:replace / th:include :代码块引入 th:fragment :定义代码块 th:object :声明变量 th:attr :设置标签属性 3. Thymeleaf模板注入漏洞原理 Thymeleaf模板注入漏洞发生在开发者将用户可控数据直接拼接到模板中时,攻击者可以构造恶意表达式实现代码执行。 漏洞产生条件: 用户输入未经充分过滤直接拼接到模板 使用 th:utext 等允许解析HTML标签的属性 使用 ${...} 等表达式直接解析用户输入 4. 漏洞利用方式 4.1 基本注入方式 当用户输入被直接拼接到模板表达式时: 攻击者可构造payload: 4.2 表达式预处理注入 Thymeleaf支持表达式预处理,攻击者可利用此特性: 4.3 URL链接表达式注入 利用 @{...} 表达式: 5. 漏洞防御措施 输入过滤 : 对用户输入进行严格过滤,特别是特殊字符和表达式语法 输出编码 : 使用 th:text 而非 th:utext ,避免HTML解析 对动态内容进行HTML编码 安全配置 : 限制模板解析模式 禁用危险表达式功能 代码规范 : 避免直接拼接用户输入到模板表达式 使用安全的模板拼接方式 6. 漏洞检测方法 尝试插入简单表达式如 ${7*7} 观察是否执行 测试各种表达式语法如 #{...} 、 @{...} 等 尝试XSS payload看是否被解析为HTML 检查错误信息中是否暴露模板引擎信息 7. 相关Java安全知识体系 Thymeleaf模板注入与以下Java安全知识相关: Java反射机制 类加载机制 Spring框架安全 JNDI注入 SPEL表达式注入 Java反序列化漏洞 Fastjson反序列化漏洞 理解这些相关技术有助于全面掌握Thymeleaf模板注入漏洞的原理和防御方法。