Thymeleaf模板注入学习
date
Jan 13, 2022
slug
thymeleaf-ssti-learn
status
Published
tags
Java安全
安全研究
summary
Thymeleaf模板注入学习
type
Post
这个东西本质上到最后利用的还是表达式执行
Thymeleaf这东西底层使用SPEL还是OGNL得看它上层使用的是什么东西,如果是使用的Spring,最后就会使用Spel解析
因为Spring推荐用的这个模板,所以会在Spring框架中经常出现
在这篇文章中,提及到这个模版有一个危险的特性:
preprocessed
,预处理他的格式是这样的:
在双下划线下里面的内容会被提前渲染,并且会执行达到模版注入的问题,但是在Tomcat下这个问题可能会失去效果,当输入点在path的时候,原因如下:Tomcat在处理path的时候是不允许存在大括号这样的符号,而且编码处理之后输入到恶意触发点是没有解码的内容,无法执行
实际应用
由于上述内容里面表明这个模板存在预处理的模式,在实际场景中会是怎么应用?这篇文章给出了demo和实验代码
介绍了Thymeleaf这个模板的一些使用方法,包括可以只调用模板的某一块内容
另外展现了三种坑会出现漏洞得点
其中两种是这样的:
底层原理是Spring在处理这个模板的内容的时候,在寻找渲染文件路径的时候会有一个表达式执行的过程,但是这个也是有条件的,需要payload里面包含
::
这么一个符号,这里的表达式执行函数就是Thymeleaf的表达式执行函数了,第二个参数的那串字符串就是需要执行的内容根据这个模版预处理的特性,需要在里面添加
__xxx__
的内容了,就可以触发针对第一种情况,渲染路径可控,我们只需要传入这样的内容
/path?lang=__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22id%22).getInputStream()).next()%7d__::.x
实际上最后的.x可以省略,这只是个随意编写的后缀而已,可以随意添加,但是
::
不可省略,是进入漏洞代码的关键条件针对第二种情况,渲染的是某个页面的某一部分内容,这个内容可控,传入的内容是这样的
/fragment?section=__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22touch%20executed%22).getInputStream()).next()%7d__::.x
但是本质上这里并不需要
::
,因为渲染的内容里面是包含::
还有第三种情况,就是当Spring返回void的时候,此时会选择URL的路径变成可控点
此时的攻击payload为,直接在路径上输入:
如何防御
有三种解决方式:
1.加上ResponseBody或者RestController注解,直接返回的HTTP Response
2.渲染路径上加上
redirect
关键字渲染3.
HttpServletResponse
加上 去框架就不会去寻找相关模板进行渲染