1. 极安网首页
  2. 网络安全技术

Thymeleaf模板注入导致命令执行漏洞分析

漏洞背景

Thymeleaf 是与 java 配合使用的一款服务端模板引擎,也是 spring 官方支持的一款服务端模板引擎。他支持 HTML 原型,在 HTML 标签中增加额外的属性来达到模板 + 数据的展示方式。默认前缀:/templates/ ,默认后缀:.html 。

首先我们来熟悉一下这个漏洞发生的一些前期知识:

一、 spring mvc 及 thymeleaf 基础

下载 github 中的项目,在 idea 中导入。(导入时选择 pom.xml 并以 project 的形式进行导入,这样他会自己去下载他的依赖,也就是 jar 包,配置 maven 这些如果有需要的话会单独写一篇文章。)
要等他下载 jar 包完成,所以稍等一会。之后,我们来到 HelloController.java 文件。

  1. @GetMapping("/")
  2. public String index(Model model) {
  3.     model.addAttribute("message""happy birthday");
  4.     return "welcome";
  5. }

这个方法名上加了 @GetMapping("/") 的注解,表示请求方法为 get 的 url 为 / 的请求会进到这个方法体里面进行处理。
在这个方法里面,给 model 传入了一个参数,key 为 message ,value 为 happy birthday ,这个 model 会和我们要返回的视图名一起传回前端。
这里的 return "welcome" 返回的是视图名,thymeleaf 会默认加上前缀 /templates 及后缀 .html ,即最终返回的视图名就是 /templates/welcome.html ,带上我们的数据 model 。

  1. <!DOCTYPE HTML>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <div th:fragment="header">
  4.     <h3>Spring Boot Web Thymeleaf Example</h3>
  5. </div>
  6. <div th:fragment="main">
  7.     <span th:text="'Hello, ' + ${message}"></span>
  8. </div>
  9. </html>

这里首先将 html 的名称空间设置为 thymeleaf ,接下来 html 文档中就可以使用 thymeleaf 中的指令了。比如接下来的 div 标签中就有 th:fragment 、th:text 这种形式,这种就是 thymeleaf 中的指令。
在倒数第三行中, ${message} 表示从 model 中取对应 key 的值,而 ${…} 这里面是 ognl/SpringEL 表达式,比如 ${7*7} 会执行里面运算,得到 49 ,同样延申一下 ognl 表达式:${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")} ,SpringEL 表达式:${T(java.lang.Runtime).getRuntime().exec('calc')} 。${} 内部的通过 OGNL 表达式引擎解析的,外部的通过 thymeleaf 模板引擎解析 。

Thymeleaf模板注入导致命令执行漏洞分析-极安网

漏洞出现在 thymeleaf 的片段选择器中,关于片段选择器是什么,通过一个小例子就会知道。

二、 片段选择器,templatename::selector

  1. @GetMapping("/fragment")
  2.     public String fragment(@RequestParam String section) {
  3.         return "welcome :: " + section; //fragment is tainted
  4.     }

这里接收一个 section 的参数,这个参数来决定我们页面显示哪一个部分。

Thymeleaf模板注入导致命令执行漏洞分析-极安网

这里没有上个的 Spring Boot Web Thymeleaf example 字样了。将 section 换为 header ,就没有 Hello, ${message} 字样了。

本文转载:FreeBuf,不代表 极安网 立场,转载请注明出处:https://secvery.com/2300.html