🗒️SSTI及Thymeleaf 模板引擎注入
2021-7-2
| 2023-4-18
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
 

简介

SSTI就是服务器端模板注入(Server-Side Template Injection),实际上也是一种注入漏洞;可以类比于SQL注入,实际上这两者的基本思想是一致的;
SSTI也是获取了一个输入,然后在后端的渲染处理上进行了语句的拼接,之后便是执行;SSTI利用的是现在网站模板引擎(Python的jinja2、mako、tornado、django;PHP的smarty、twig;JAVA的jade、等等),当在运用这些框架对运用渲染函数生成html的时候便会出现SSTI的问题

模板引擎

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
Thymeleaf 模板注入
Thymeleaf 是与 java 配合使用的一款服务端模板引擎,也是 spring 官方支持的一款服务端模板引擎。他支持 HTML 原型,在 HTML 标签中增加额外的属性来达到模板 + 数据的展示方式。默认前缀:/templates/ ,默认后缀:.html 。

漏洞原理

1.片段选择器,templatename::selector 2.预处理${expression} 片段选择器可以传入模板名,而模板名带有::时,会被thymeleaf 视为表达式执行. Thymeleaf 有预处理表达式的功能,在正常表达式之前完成的表达式的执行,允许修改最终将执行的表达式。

利用场景

1.模板参数外部可控 2.使用@GetMapping注解 且没有返回 根据spring boot定义,如果controller无返回值(没有返回值返回值为void),则以路由为视图名称。 在此场景下视图名在url中获取,此时在 url中的参数改为payload即可.
notion image

审计

1.搜索return.?".?index,查看接口参数是否外部可控,方法是否无返回值并且没有配置 @ResponseBody 或者 @RestController

修复和防御

  1. 方法上配置 @ResponseBody 或者 @RestController 这样 spring 框架就不会将其解析为视图名,而是直接返回。 @RestController 表示该控制器会直接将业务方法的返回值响应给客户端,不进行视图解析。它内部继承了 @ResponseBody 。
  1. 在返回值前面加上 "redirect:" 这样不再由 Spring ThymeleafView来进行解析,而是由 RedirectView 来进行解析。
  1. 在方法参数中加上 HttpServletResponse 参数 这样 spring 会认为已经处理了 response ,无须再去进行视图名的解析。在 ServletResponseMethodArgumentResolver 类中检查了此参数。
漏洞
  • 表达式
  • 漏洞
  • Struts2 S2-052反序列化漏洞SSRF-服务端请求伪造
    目录