第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)

渗透技巧 1年前 (2023) admin
347 0 0

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)

 Part1 前言 

前一阵子朋友让我帮忙看一套金融系统源代码的安全问题,从去年大比赛过后,我好久没审计过代码了,于是就仔细看了看。首先这套系统用的是Springboot框架,而且没有找到Java反序列化漏洞,SQL注入漏洞被预编译写法彻底封死,也没有上传漏洞,Fastjson用的1.2.83版本,Log4j2版本也较新。最后快放弃的时候,重新检查了配置文件,发现了thymeleaf组件,通过idea在代码中各种搜索,最后发现了4处thymeleaf模板注入漏洞。

在研究thymeleaf模板注入漏洞的时候,发现网上的文章非常多,但是有些地方说法不一样,部分还有错误。这样ABC_123就参考网上的文章,自己写代码搭建环境,测试不同情况下的thymeleaf模板注入漏洞的利用方法,把测试结果分享给大家。

建议大家把公众号“希潭实验室”设为星标,否则可能就看不到啦!因为公众号现在只对常读和星标的公众号才能展示大图推送。操作方法:点击右上角的【…】,然后点击【设为星标】即可。

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)

 Part2 技术研究过程 

  • 搭建环境遇到的坑

 1   第1个坑

上手搭建环境ABC_123就踩了一个大坑,我发现github上下载的环境都没法测试成功,经过反复测试才发现,是因为其漏洞环境pom.xml中没有配置版本号,默认是使用最新版本thymeleaf组件,而最新版本的thymeleaf组件是没有模板注入漏洞的,也许将来会有安全人员挖掘出新的绕过方法


 2   第2个坑

较新的存在漏洞的thymeleaf版本,需要使用那些通过%0A、%0D的绕过语句才能执行。如果还是测试不成功,记得需要把payload中的特殊字符进行URL编码,如果实在是不知道该对哪些特殊字符进行URL编码,那就如下图所示,把整个payload都URL编码吧

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


  • 前置基础知识

Thymeleaf 模板的表达式有以下几种:变量表达式:${…}、选择变量表达式:*{…}、消息表达式:#{…}、链接 URL 表达式:@{…}、片段表达式:~{…}。所以很多thymeleaf 模板的注入语句 ${…} 换成 *{…} 也是可以利用成功的

接下再看一个基础知识点,如下图所示,图中的代码return “welcome”指的是返回视图名,thymeleaf 会为welcome视图名加上默认前缀/templates及后缀.html,即最终返回的视图名就是 /templates/welcome.html,然后会带上我们的数据model

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


有了前置的基础知识,接下来再讲一下thymeleaf模板注入漏洞存在的三种形式。


  • 第一种情况,return内容可控

这种情况最容易出现thymeleaf模板注入漏洞,一旦用户提交的数据可以传到return语句中,攻击者就可以提交恶意模板注入语句使thymeleaf组件进行模板解析,造成代码执行漏洞。

刚开始看这个thymeleaf模板注入漏洞时,我就被网上的各种不同的java代码写法弄得云里雾里的,最后测试来测试去,发现差别不大,其实就是攻击者可以操控return中的值,就有可能造成模板注入漏洞,只是在不同情况下,漏洞利用语句会有不同ABC_123总结网上各种文章、各种github资源,发现存在漏洞的java代码写法大致有以下4种:

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


经过测试,发现同样的语句,都可以弹计算器成功。

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


  • 第二种情况,URL路径可控

这种情况比较少见,要求方法的返回类必须为void,此时会从URL中获取viewname,以URL路由为视图名称,调用模板视图去解析。

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


接下来看网上的文章最常用的一种写法,很明显可以测试成功(这里为了方便展示,payload直接贴出来了,大家实际测试的时候,需要把payload进行URL编码)。

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


接下来看/doc2的情况,这里我把@GetMapping换成了@RequestMapping,发现漏洞也是可以利用成功的,而且不只GET请求,貌似各种请求都可以利用成功。

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


甚至PUT请求都是可以测试成功,这点是没有想到,看来URL路径可控情况下,这个漏洞也不是只有GET请求才能触发

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


这种情况肯定是测试不成功的,因为代码中document被@RequestParam修饰了

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


  • 第三种情况,模板内容可控

模板内容可控这种情况太少见了,我就不展开说了。ABC_123把自己测试成功的代码截图发出来,给大家参考一下,估计实际使用中,很少有程序员会这么去写代码,但是万一遇到了呢。

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


  • 不存在漏洞的情况及修复建议

 1   使用@ResponseBody或@RestController修饰

@ResponseBody 是一个Spring框架中的注解,它用于指示该方法的返回值应该直接写入HTTP响应正文ResponseBody中,而不是通过视图解析器进行渲染。使用 @ResponseBody 注解可以将方法返回值以JSON、XML等格式直接写入HTTP响应体中,常用于返回 RESTful API 接口的响应数据。

@RestController是Spring框架中的一个注解,它结合了@Controller和 @ResponseBody注解的功能,用于简化 RESTful Web 服务开发。

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


 2   使用redirect:或forward:修饰

根据springboot定义,如果名称以redirect:开头,则不再调用ThymeleafView解析,调用RedirectView去解析controller的返回值。这里需要注意的是,除了redirect:之外,还有forward:,这点网上很少提到

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


 3   设置为HttpServletResponse

由于controller的参数被设置为HttpServletResponse,Spring认为它已经处理了HTTP Response,因此不会发生视图名称解析,也就不会存在模板注入漏洞了。

第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)


 Part3 总结 

1.  后续ABC_123会专门写一篇文章,总结不同版本的thymeleaf模板注入漏洞测试语句以及绕waf方法,欢迎关注我的公众号“希潭实验室”。


第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)

公众号专注于网络安全技术分享,包括APT事件分析、红队攻防、蓝队分析、渗透测试、代码审计等,每周一篇,99%原创,敬请关注。

Contact me: 0day123abc#gmail.com(replace # with @)


原文始发于微信公众号(希潭实验室):第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇)

版权声明:admin 发表于 2023年5月6日 下午7:21。
转载请注明:第60篇:Thymeleaf模板注入漏洞总结及修复方法(上篇) | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...