一、Spring Boot框架介绍
Spring
框架功能很强大,但是就算是一个很简单的项目,我们也要配置很多东西。因此就有了Spring Boot
框架,它的作用很简单,就是帮我们自动配置,其设计目的是用来简化新Spring
应用的初始搭建以及开发过程。
Spring Boot
框架的核心就是自动配置,只要存在相应的jar包,Spring
就帮我们自动配置。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。如果默认配置不能满足需求,我们还可以替换掉自动配置类,使用我们自己的配置。另外,Spring Boot
还集成了嵌入式的Web服务器,系统监控等很多有用的功能,让我们快速构建企业及应用程序。
二、Actuator中间件工具
Actuator
是Spring Boot
提供的服务监控和管理工具。当Spring Boot
应用程序运行时,它会自动将多个端点注册到路由进程中。而由于对这些端点的错误配置,就有可能导致一些敏感信息泄露。
三、确定Spring Boot框架
1、网站的icon文件
2、页面存在特有的报错信息
四、敏感信息泄露漏洞
Spring Boot < 1.5
:默认未授权访问所有端点。Spring Boot >= 1.5
:默认只允许访问/health
和/info
端点,但是此安全性通常被应用程序开发人员禁用了。
每个端点的作用和详细描述
路径 描述 默认启用
auditevents 显示当前应用程序的审计事件信息 Yes
beans 显示一个应用中所有Spring Beans的完整列表 Yes
conditions 显示配置类和自动配置类(configuration and auto-configuration classes)的状态及它们被应用或未被应用的原因
configprops 显示一个所有@ConfigurationProperties的集合列表 Yes
env 显示来自Spring的 ConfigurableEnvironment的属性 Yes
flyway 显示数据库迁移路径,如果有的话 Yes
health 显示应用的健康信息(当使用一个未认证连接访问时显示一个简单 的’status’,使用认证连接访问则显示全部信息详情)
info 显示任意的应用信息 Yes
liquibase 展示任何Liquibase数据库迁移路径,如果有的话 Yes
metrics 展示当前应用的metrics信息 Yes
mappings 显示一个所有@RequestMapping路径的集合列表 Yes
scheduledtasks 显示应用程序中的计划任务 Yes
sessions 允许从Spring会话支持的会话存储中检索和删除(retrieval and deletion) 用户会话。使用Spring Session对反应性Web应用程序的支持时不可用。
shutdown 允许应用以优雅的方式关闭(默认情况下不启用) No
threaddump 执行一个线程dump Yes
heapdump 返回一个GZip压缩的hprof堆dump文件 Yes
jolokia 通过HTTP暴露JMX beans(当Jolokia在类路径上时,WebFlux不可用) Yes
logfile 返回日志文件内容(如果设置了logging.file或logging.path属性的话),支持使用HTTP Range头接收日志文件内容的部分信息 Yes
prometheus 以可以被Prometheus服务器抓取的格式显示metrics信息 Yes
1、访问/actuator
如果网站设置了management.endpoints.web.exposure.include
为*
,那么我们可以在/actuator
看到所有存在的端点
2、访问/actuator/version
会泄露一些版本信息
3、访问/env或者/actuator/env
其中可能会泄露数据库账号密码等敏感信息
针对env这种路径下泄露的密码基本上都是加密的,会用星号进行脱敏,想要获取相应的明文密码可以尝试后面通过分析heapdump数据的方式。
4、访问/actuator/metrics
获得每个度量的名称,其中主要监控了JVM内容使用、GC情况、类加载信息等
如果想要得到每个度量的详细信息,需要传递度量的名称到URL中,如下
http://xx.xx.xx.xx/actuator/metrics
5、访问/actuator/threaddump
获取服务器的线程堆栈信息
6、访问/actuator/loggers
获取服务器的日志级别
7、访问/actuator/configprops
查看配置文件中设置的属性内容,以及一些配置属性的默认值
8、访问/actuator/info
展示了关于应用的一般信息,这些信息从编译文件比如META-INF/build-info.properties
或者git文件比如git.properties
或者任何环境的property
中获取
9、访问/actuator/prometheus
获取一些监控指标
10、访问/actuator/mappings
响应信息描述全部的URI路径,以及它们和控制器的映射关系
11、访问/actuator/health
health
一般只展示了简单的UP和DOWN状态,比如这样:
为了获得健康检查中所有指标的详细信息,就需要通过在application.yaml
中增加如下内容
management:
endpoint:
health:
show-details: always
一旦打开上述开关,那么在/health
中可以看到详细内容,比如下面这样
{
"status": "UP",
"diskSpace": {
"status": "UP",
"total": 209715195904,
"free": 183253909504,
"threshold": 10485760
}
"db": {
"status": "UP",
"database": "MySQL",
"hello": 1
}
}
12、访问/heapdump或者/actuator/heapdump
Heap Dump也叫堆转储文件,是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC,所以heap dump文件中保存的是FullGC后留下的对象信息。其中可能会含有敏感数据,如数据库的密码明文等。
直接访问路径会返回一个GZip压缩的JVM堆dump,其中是jvm heap
信息。下载的heapdump
文件大小通常在 50M—500M 之间,有时候也可能会大于 2G。
下载完成之后可以借助一些工具对其中的数据进行内容检索,寻找敏感信息。
推荐工具:
1.Eclipse Memory Analyzer(MAT)
https://www.eclipse.org/mat/downloads.php
使用MAT打开heapdump文件
选择使用OQL进行查询
查看所有配置信息的语句,点击上方红色的感叹号执行语句
select * from org.springframework.web.context.support.StandardServletEnvironment
查看包含“password”的信息的语句
select * from java.util.LinkedHashMap$Entry s WHERE (toString(s.key).contains("password"))
或者
select * from java.util.Hashtable$Entry s WHERE (toString(s.key).contains("password"))
查看包含“SESSION”的信息
select * from java.lang.String s WHERE toString(s) LIKE ".*SESSION.*"
2.heapdump_tool
https://github.com/wyzxxz/heapdump_tool
加载heapdump文件,选择1
模式加载文件中所有的对象
查找包含password
字段的的对象,返回大量的信息
除了明文密码,还可以查找其他信息getip
获取IP地址信息
getfile
获取文件信息
geturl
获取url信息
3.JDumpSpider
https://github.com/whwlsfb/JDumpSpider
使用方法
https://blog.csdn.net/gw5205566/article/details/105666637
五、相关脚本和字典
1、Spring Boot敏感端点路径专属字典
%20/swagger-ui.html
actuator
actuator/auditevents
actuator/beans
actuator/conditions
actuator/configprops
actuator/env
actuator/health
actuator/heapdump
actuator/httptrace
actuator/hystrix.stream
actuator/info
actuator/jolokia
actuator/logfile
actuator/loggers
actuator/mappings
actuator/metrics
actuator/scheduledtasks
actuator/swagger-ui.html
actuator/threaddump
actuator/trace
api.html
api/index.html
api/swagger-ui.html
api/v2/api-docs
api-docs
auditevents
autoconfig
beans
caches
cloudfoundryapplication
conditions
configprops
distv2/index.html
docs
druid/index.html
druid/login.html
druid/websession.html
dubbo-provider/distv2/index.html
dump
entity/all
env
env/(name)
eureka
flyway
gateway/actuator
gateway/actuator/auditevents
gateway/actuator/beans
gateway/actuator/conditions
gateway/actuator/configprops
gateway/actuator/env
gateway/actuator/health
gateway/actuator/heapdump
gateway/actuator/httptrace
gateway/actuator/hystrix.stream
gateway/actuator/info
gateway/actuator/jolokia
gateway/actuator/logfile
gateway/actuator/loggers
gateway/actuator/mappings
gateway/actuator/metrics
gateway/actuator/scheduledtasks
gateway/actuator/swagger-ui.html
gateway/actuator/threaddump
gateway/actuator/trace
health
heapdump
heapdump.json
httptrace
hystrix
hystrix.stream
info
intergrationgraph
jolokia
jolokia/list
liquibase
logfile
loggers
mappings
metrics
monitor
prometheus
refresh
scheduledtasks
sessions
shutdown
spring-security-oauth-resource/swagger-ui.html
spring-security-rest/api/swagger-ui.html
static/swagger.json
sw/swagger-ui.html
swagger
swagger/codes
swagger/index.html
swagger/static/index.html
swagger/swagger-ui.html
swagger-dubbo/api-docs
swagger-ui
swagger-ui.html
swagger-ui/html
swagger-ui/index.html
system/druid/index.html
template/swagger-ui.html
threaddump
trace
user/swagger-ui.html
v1.1/swagger-ui.html
v1.2/swagger-ui.html
v1.3/swagger-ui.html
v1.4/swagger-ui.html
v1.5/swagger-ui.html
v1.6/swagger-ui.html
v1.7/swagger-ui.html
/v1.8/swagger-ui.html
/v1.9/swagger-ui.html
/v2.0/swagger-ui.html
v2.1/swagger-ui.html
v2.2/swagger-ui.html
v2.3/swagger-ui.html
v2/swagger.json
webpage/system/druid/index.html
2、Spring Boot信息泄露扫描脚本
import requests
import time
with open("url.txt", 'r') as temp:
for url in temp.readlines():
url = url.strip('\n')
with open("SpringBoot信息泄露目录字典.txt", 'r') as web:
webs = web.readlines()
for web in webs:
web = web.strip()
u = url + web
r = requests.get(u)
print("url为:" + u + ' ' + "状态为:%d"%r.status_code + ' ' + "content-length为:" + str(len(r.content)))