【JavaEE安全】Spring Boot 安全实战:从路由响应到 MyBatis 注入与 Thymeleaf SSTI

警告:以下内容仅用于安全研究与授权测试,未经许可的攻击行为属于违法行为。


一、Spring Boot Web 应用:路由与响应

1.1 路由映射注解

Spring Boot 通过注解实现请求路由,核心注解如下:

注解 作用 示例
@RestController 标记类为控制器,所有方法直接返回数据(JSON/字符串) @RestController public class DemoController {}
@RequestMapping 通用路由映射,支持所有 HTTP 方法 @RequestMapping("/test")
@GetMapping 仅映射 GET 请求,是 @RequestMapping 的简化 @GetMapping("/get")

代码示例

java 复制代码
@RestController
public class RouteController {
    // 映射 /hello 路径,支持所有请求方法
    @RequestMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot";
    }

    // 仅映射 GET 请求到 /get
    @GetMapping("/get")
    public String getDemo() {
        return "This is a GET request";
    }
}

1.2 参数传递与数据响应

  • @RequestParam:从 URL 查询参数或表单中提取参数。
  • @PathVariable :从 URL 路径中提取参数(如 /user/{id})。
  • @RestController :方法返回值直接作为 HTTP 响应体,无需 @ResponseBody

代码示例

java 复制代码
@RestController
public class ParamController {
    // 提取 URL 参数 ?name=xxx
    @GetMapping("/greet")
    public String greet(@RequestParam String name) {
        return "Hello, " + name;
    }

    // 提取 URL 路径 /user/123
    @GetMapping("/user/{id}")
    public String getUser(@PathVariable String id) {
        return "User ID: " + id;
    }
}

二、Spring Boot 数据库应用:MyBatis 注入

2.1 项目依赖配置

pom.xml 中添加 MyBatis 和 MySQL 驱动依赖:

xml 复制代码
<!-- MyBatis Spring Boot Starter -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>

<!-- MySQL 驱动 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

2.2 数据库连接配置

application.yml 中配置数据源:

yaml 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo_db
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

2.3 MyBatis Mapper 与 SQL 注入风险

MyBatis 支持两种参数绑定方式,${} 直接拼接字符串,存在 SQL 注入风险 ,而 #{} 会预编译 SQL,相对安全。

危险代码示例(SQL 注入)

java 复制代码
@Mapper
public interface UserMapper {
    // 危险:使用 ${} 直接拼接参数,可被注入
    @Select("SELECT * FROM admin WHERE id LIKE '%${id}%'")
    List<User> findByUnsafeId(@Param("id") String id);
}

安全代码示例

java 复制代码
@Mapper
public interface UserMapper {
    // 安全:使用 #{} 预编译参数
    @Select("SELECT * FROM admin WHERE id LIKE CONCAT('%', #{id}, '%')")
    List<User> findBySafeId(@Param("id") String id);
}

2.4 Web 层调用与漏洞触发

Controller 层通过 @Autowired 注入 Mapper,接收用户输入并调用 Mapper 方法,若输入未过滤,将直接触发注入。

java 复制代码
@RestController
public class UserController {
    @Autowired
    private UserMapper userMapper;

    // 接收用户输入 id,调用存在注入风险的 Mapper 方法
    @GetMapping("/getdata")
    public List<User> getData(@RequestParam String id) {
        return userMapper.findByUnsafeId(id);
    }
}

三、Spring Boot 模板引擎:Thymeleaf SSTI

3.1 Thymeleaf 配置

application.properties 中配置模板路径和后缀:

properties 复制代码
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

3.2 控制器与模板渲染

控制器将数据放入 Model,返回视图名称,Thymeleaf 负责渲染 HTML 页面。

java 复制代码
@Controller
public class TemplateController {
    // 渲染 index.html 模板,传递 data 变量
    @RequestMapping("/")
    public String index(Model model) {
        model.addAttribute("data", "Hello, Thymeleaf");
        return "index"; // 指向 templates/index.html
    }

    // 存在 SSTI 风险的代码:直接返回用户输入作为视图名
    @GetMapping("/path")
    public String thymeleafSSTI(@RequestParam String lang) {
        return lang; // 若 lang 可控且版本存在漏洞,可触发 SSTI
    }
}

3.3 SSTI 漏洞原理

在特定版本的 Thymeleaf 中,若视图名称由用户可控且未被过滤,攻击者可构造恶意视图名,触发服务器端模板注入(SSTI),执行任意代码。例如,利用表达式注入执行系统命令。

参考链接Thymeleaf 模板注入漏洞分析


四、Maven 项目配置(pom.xml)

Spring Boot 项目通过 pom.xml 管理依赖和构建,核心配置如下:

xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.RELEASE</version>
    <relativePath/>
</parent>

<dependencies>
    <!-- Web 开发启动器 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Thymeleaf 模板引擎 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!-- Spring Boot 构建插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

五、总结与安全视角

Spring Boot 简化了开发流程,但也引入了新的安全风险:

  • 路由与参数:未过滤的用户输入直接进入业务逻辑,是所有攻击的入口。
  • MyBatis${} 拼接 SQL 是注入的重灾区,必须严格使用 #{} 或 MyBatis 动态 SQL。
  • Thymeleaf:视图名称可控时,需警惕 SSTI 漏洞,及时升级至安全版本。

深入理解这些组件的交互方式和风险点,是进行 Spring Boot 安全审计和渗透测试的基础。

相关推荐
Bruce_Liuxiaowei2 小时前
[特殊字符]OpenClaw爆火背后的安全冷思 MEMORY.md与SKILL.md:安全架构与最佳实践
人工智能·安全·ai·agent·安全架构·智能体
于眠牧北2 小时前
分布式环境在@Transation注解下锁释放问题
spring boot·redis·分布式
珠海西格2 小时前
红区蔓延的底层逻辑:分布式光伏爆发与配电网短板的“时空错配”
大数据·服务器·分布式·安全·架构
爱笑的源码基地2 小时前
基于云计算的基层医疗信息系统,springMVC框架开发的云HIS系统源码
spring boot·后端·源码·二次开发·his·源代码·医院管理信息系统
乂爻yiyao3 小时前
Spring Boot Fat JAR 容器化指南
spring boot·后端·jar
nington017 小时前
鸿蒙PC联合宁盾共同开发的“身份域管+网络准入一体化认证方案”将于5月重磅发布
安全·鸿蒙pc
AdMergeX8 小时前
行业热点资讯 | 网信办公布数据出境安全管理政策法规问答;搜狗输入法正式宣布全面AI化;百度文心助手入局春节AI战;
人工智能·安全·百度
Mr.朱鹏10 小时前
JVM-GC垃圾回收案例
java·jvm·spring boot·算法·spring·spring cloud·java-ee
智能工业品检测-奇妙智能10 小时前
AIFlowy如何实现与现有Spring Boot项目的无缝集成?
java·spring boot·后端