警告:以下内容仅用于安全研究与授权测试,未经许可的攻击行为属于违法行为。
一、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 安全审计和渗透测试的基础。