前一阵子朋友让我帮忙看一套金融系统源代码的安全问题,从去年大比赛过后,我好久没审计过代码了,于是就仔细看了看。首先这套系统用的是Springboot框架,而且没有找到Java反序列化漏洞,SQL注入漏洞被预编译写法彻底封死,也没有上传漏洞,Fastjson用的1.2.83版本,Log4j2版本也较新。最后快放弃的时候,重新检查了配置文件,发现了thymeleaf组件,通过idea在代码中各种搜索,最后发现了4处thymeleaf模板注入漏洞。
在研究thymeleaf模板注入漏洞的时候,发现网上的文章非常多,但是有些地方说法不一样,部分还有错误。这样ABC_123就参考网上的文章,自己写代码搭建环境,测试不同情况下的thymeleaf模板注入漏洞的利用方法,把测试结果分享给大家。
建议大家把公众号“希潭实验室”设为星标,否则可能就看不到啦!因为公众号现在只对常读和星标的公众号才能展示大图推送。操作方法:点击右上角的【...】,然后点击【设为星标】即可。
上手搭建环境ABC_123就踩了一个大坑,我发现github上下载的环境都没法测试成功,经过反复测试才发现,是因为其漏洞环境pom.xml中没有配置版本号,默认是使用最新版本thymeleaf组件,而最新版本的thymeleaf组件是没有模板注入漏洞的,也许将来会有安全人员挖掘出新的绕过方法。
2 第2个坑
较新的存在漏洞的thymeleaf版本,需要使用那些通过%0A、%0D的绕过语句才能执行。如果还是测试不成功,记得需要把payload中的特殊字符进行URL编码,如果实在是不知道该对哪些特殊字符进行URL编码,那就如下图所示,把整个payload都URL编码吧。
Thymeleaf 模板的表达式有以下几种:变量表达式:${...}、选择变量表达式:*{...}、消息表达式:#{...}、链接 URL 表达式:@{...}、片段表达式:~{...}。所以很多thymeleaf 模板的注入语句 ${...} 换成 *{...} 也是可以利用成功的。
接下再看一个基础知识点,如下图所示,图中的代码return “welcome”指的是返回视图名,thymeleaf 会为welcome视图名加上默认前缀/templates及后缀.html,即最终返回的视图名就是 /templates/welcome.html,然后会带上我们的数据model。
有了前置的基础知识,接下来再讲一下thymeleaf模板注入漏洞存在的三种形式。
这种情况最容易出现thymeleaf模板注入漏洞,一旦用户提交的数据可以传到return语句中,攻击者就可以提交恶意模板注入语句使thymeleaf组件进行模板解析,造成代码执行漏洞。
刚开始看这个thymeleaf模板注入漏洞时,我就被网上的各种不同的java代码写法弄得云里雾里的,最后测试来测试去,发现差别不大,其实就是攻击者可以操控return中的值,就有可能造成模板注入漏洞,只是在不同情况下,漏洞利用语句会有不同。ABC_123总结网上各种文章、各种github资源,发现存在漏洞的java代码写法大致有以下4种:
经过测试,发现同样的语句,都可以弹计算器成功。
这种情况比较少见,要求方法的返回类必须为void,此时会从URL中获取viewname,以URL路由为视图名称,调用模板视图去解析。
接下来看网上的文章最常用的一种写法,很明显可以测试成功(这里为了方便展示,payload直接贴出来了,大家实际测试的时候,需要把payload进行URL编码)。
接下来看/doc2的情况,这里我把@GetMapping换成了@RequestMapping,发现漏洞也是可以利用成功的,而且不只GET请求,貌似各种请求都可以利用成功。
甚至PUT请求都是可以测试成功,这点是没有想到,看来URL路径可控情况下,这个漏洞也不是只有GET请求才能触发。
这种情况肯定是测试不成功的,因为代码中document被@RequestParam修饰了。
模板内容可控这种情况太少见了,我就不展开说了。ABC_123把自己测试成功的代码截图发出来,给大家参考一下,估计实际使用中,很少有程序员会这么去写代码,但是万一遇到了呢。
1 使用@ResponseBody或@RestController修饰
@RestController是Spring框架中的一个注解,它结合了@Controller和 @ResponseBody注解的功能,用于简化 RESTful Web 服务开发。
2 使用redirect:或forward:修饰
根据springboot定义,如果名称以redirect:开头,则不再调用ThymeleafView解析,调用RedirectView去解析controller的返回值。这里需要注意的是,除了redirect:之外,还有forward:,这点网上很少提到。
3 设置为HttpServletResponse
由于controller的参数被设置为HttpServletResponse,Spring认为它已经处理了HTTP Response,因此不会发生视图名称解析,也就不会存在模板注入漏洞了。
Part3 总结
1. 后续ABC_123会专门写一篇文章,总结不同版本的thymeleaf模板注入漏洞测试语句以及绕waf方法,欢迎关注我的公众号“希潭实验室”。
公众号专注于网络安全技术分享,包括APT事件分析、红队攻防、蓝队分析、渗透测试、代码审计等,每周一篇,99%原创,敬请关注。
Contact me: 0day123abc#gmail.com(replace # with @)