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提供多种表达式语法:
${...}- 变量表达式(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 基本注入方式
当用户输入被直接拼接到模板表达式时:
@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. 漏洞防御措施
-
输入过滤:
- 对用户输入进行严格过滤,特别是特殊字符和表达式语法
-
输出编码:
- 使用
th:text而非th:utext,避免HTML解析 - 对动态内容进行HTML编码
- 使用
-
安全配置:
- 限制模板解析模式
- 禁用危险表达式功能
-
代码规范:
- 避免直接拼接用户输入到模板表达式
- 使用安全的模板拼接方式
6. 漏洞检测方法
- 尝试插入简单表达式如
${7*7}观察是否执行 - 测试各种表达式语法如
#{...}、@{...}等 - 尝试XSS payload看是否被解析为HTML
- 检查错误信息中是否暴露模板引擎信息
7. 相关Java安全知识体系
Thymeleaf模板注入与以下Java安全知识相关:
- Java反射机制
- 类加载机制
- Spring框架安全
- JNDI注入
- SPEL表达式注入
- Java反序列化漏洞
- Fastjson反序列化漏洞
理解这些相关技术有助于全面掌握Thymeleaf模板注入漏洞的原理和防御方法。