写点什么

Springboot actuator 不可不注意的安全问题 - 可越权 - 可脱库

用户头像
果果果
关注
发布于: 2021 年 05 月 31 日
Springboot actuator不可不注意的安全问题-可越权-可脱库

1. 通过 httptrace 越权

httptrace 是该应用每一次被 http 访问的记录,包含每次 request 的 cookie、请求参数、等。设想一下如果拿到用户请求的 cookie,那么就可以登录该用户的账户进行任意操作。


第一步,创建 springboot 项目、pom 引入 actuator


<dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId></dependency>
复制代码


第二步,在 application.properties 中增加暴露所有端点配置,默认只暴露(/health)


management.endpoints.web.exposure.include=*


第三步,注入 HttpTraceRepository Bean,httptrace 的存储方式


@Configurationpublic class APPConfig {
@Bean @ConditionalOnMissingBean(HttpTraceRepository.class) public HttpTraceRepository traceRepository(){ return new InMemoryHttpTraceRepository(); }
}
复制代码


看一下结果,暴露的有哪些端点,访问(http://127.0.0.1:9999/actuator/



访问 httptrace 看一下有哪些信息http://127.0.0.1:9999/actuator/httptrace



如果这个 cookie 是用户登录态 cookie,那么就可以模拟该用户做任意操作了。

2. 通过 heapdump 获取数据库密码,完成脱库

第一步,通过访问http://127.0.0.1:9999/actuator/env 查看应用配置信息



Json format 一下,搜索 datasource,可以看到数据库账号、链接字符串,密码被隐藏掉了。所有和密码相关的 actuator 都会在输出的时候替换成***。



第二步,通过配置文件不能看到密码,那就只能通过堆来看看能不能找到,因为我们所有的 java 对象都存在于堆上,这里可以看出来使用的使用阿里巴巴的的 Druid 连接池,所以数据库配置相关也应该在这个 class 的实例上。


通过http://127.0.0.1:9999/actuator/heapdump 会执行 dump 并下载,然后我们通过 Jhat 来分析该 dump 文件



访问http://127.0.0.1:7000/ 查看 heapdump 分析


在页面 control+f 搜索 datasource DataSourceInitializationMode



点进去经过 2 层就能找到 heap 中数据库的账号和密码以及 url



到这里,我们就能成功拿到链接数据库的所有信息了。当然规范一点的公司用于程序链接的账号 密码 host 是隔离的,也就是说就算拿到对的账号和密码,host 是机房内才能访问,那么你依然无法链接数据库。如果用的是公网链接那么就发生严重的安全事故了。


数据安全是企业的根本,安全事故往往就发生在这些细节上,安全无小事,研发需谨慎。


上面的安全问题有很多种解决办法 1、通过应用本身的配置,只开放基础的端点,例如健康检查,服务中心会用来检测心跳。


2、通过引入 auth,访问敏感端点授权。


3、通过软负载限制,如有使用例如 nginx 来做软负载,那么可以在 nginx 设置访问规则,访问敏感的端点,直接拒绝。


4、存储层本身的账号安全控制,例如统一引入加密机制。

用户头像

果果果

关注

还未添加个人签名 2017.11.02 加入

还未添加个人简介

评论

发布
暂无评论
Springboot actuator不可不注意的安全问题-可越权-可脱库