Thymeleaf模板注入学习

date
Jan 13, 2022
slug
thymeleaf-ssti-learn
status
Published
tags
Java安全
安全研究
summary
Thymeleaf模板注入学习
type
Post
这个东西本质上到最后利用的还是表达式执行
Thymeleaf这东西底层使用SPEL还是OGNL得看它上层使用的是什么东西,如果是使用的Spring,最后就会使用Spel解析
notion image
因为Spring推荐用的这个模板,所以会在Spring框架中经常出现
在这篇文章中,提及到这个模版有一个危险的特性:preprocessed,预处理
他的格式是这样的:
notion image
在双下划线下里面的内容会被提前渲染,并且会执行达到模版注入的问题,但是在Tomcat下这个问题可能会失去效果,当输入点在path的时候,原因如下:Tomcat在处理path的时候是不允许存在大括号这样的符号,而且编码处理之后输入到恶意触发点是没有解码的内容,无法执行
notion image
 

实际应用

由于上述内容里面表明这个模板存在预处理的模式,在实际场景中会是怎么应用?这篇文章给出了demo和实验代码
介绍了Thymeleaf这个模板的一些使用方法,包括可以只调用模板的某一块内容
另外展现了三种坑会出现漏洞得点
其中两种是这样的:
notion image
底层原理是Spring在处理这个模板的内容的时候,在寻找渲染文件路径的时候会有一个表达式执行的过程,但是这个也是有条件的,需要payload里面包含:: 这么一个符号,这里的表达式执行函数就是Thymeleaf的表达式执行函数了,第二个参数的那串字符串就是需要执行的内容
notion image
根据这个模版预处理的特性,需要在里面添加__xxx__ 的内容了,就可以触发
针对第一种情况,渲染路径可控,我们只需要传入这样的内容
 /path?lang=__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22id%22).getInputStream()).next()%7d__::.x
实际上最后的.x可以省略,这只是个随意编写的后缀而已,可以随意添加,但是:: 不可省略,是进入漏洞代码的关键条件
notion image
notion image
针对第二种情况,渲染的是某个页面的某一部分内容,这个内容可控,传入的内容是这样的
/fragment?section=__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22touch%20executed%22).getInputStream()).next()%7d__::.x
但是本质上这里并不需要:: ,因为渲染的内容里面是包含::
notion image
还有第三种情况,就是当Spring返回void的时候,此时会选择URL的路径变成可控点
notion image
此时的攻击payload为,直接在路径上输入:
notion image

如何防御

有三种解决方式:
notion image
1.加上ResponseBody或者RestController注解,直接返回的HTTP Response
2.渲染路径上加上redirect 关键字渲染
3. HttpServletResponse 加上 去框架就不会去寻找相关模板进行渲染

© 4me 2021 - 2024